https://foro.gambas-es.org/viewtopic.php?f=1&t=8141
-----------------------------------
calcena
Sabado, 04 Julio 2020, 23:13

Restar Días A Una Fecha
-----------------------------------
Buenas, 
pretendo restar días a una fecha y pensando que debería funcionar como por ejemplo Sql Server que puedes utilizar dateAdd con valores negativos para restarlos, pero siempre los añade.

DateAdd(dFecha, gb.Day, -30)

Gracias.


-----------------------------------
gambafeliz
Domingo, 05 Julio 2020, 07:39

Re: Restar Días A Una Fecha
-----------------------------------
[quote user="calcena" post="49033"]Buenas, 
pretendo restar días a una fecha y pensando que debería funcionar como por ejemplo Sql Server que puedes utilizar dateAdd con valores negativos para restarlos, pero siempre los añade.

DateAdd(dFecha, gb.Day, -30)

Gracias.[/quote]

Hola, calcena

Te pongo un ejemplo:

   ' Le paso 01/07/2020 hago dos conversiones en este ejemplo, primero a String y después convierto este String a fecha local ya que DateAdd trabaja con fecha
   dtFechaUnoMes = Val("01/" & CStr(iLocalMes) & "/" & CStr(iAno)) 
   dtFechaFinMes = DateAdd(dtFechaUnoMes, gb.Day, -1) ' esto le va a restar un día a la fecha anterior y lo pondrá a 30/06/2020

Espero que esto te funcione, ya que a mi sí.

Saludos.


-----------------------------------
Shell
Domingo, 05 Julio 2020, 11:30

Re: Restar Días A Una Fecha
-----------------------------------
calcena:

Pues no sé por que no te funciona. No vas mal desencaminado.

[code linenumbers=false syntax=gambas]
Public Sub Main()
  
  Dim fechadehoy As Date
  Dim fechaanterior As Date
  
  fechadehoy = Date(Now)
  
  Print "Hoy es: " & Format(fechadehoy, "dd/mm/yyyy")
  
  Print "Restamos treinta días..."
  
  fechaanterior = DateAdd(fechadehoy, gb.day, -30)
  
  Print "Si restamos treinta días la fecha es: " & Format(fechaanterior, "dd/mm/yyyy") 
  
End
[/code]

Salida:

[quote]
Hoy es: 05/07/2020
Restamos treinta días...
Si restamos treinta días la fecha es: 05/06/2020
[/quote]

¿ Lo convertiste a tipo fecha ?.

Saludos


-----------------------------------
Shell
Domingo, 05 Julio 2020, 11:45

Re: Restar Días A Una Fecha
-----------------------------------
Supongamos que queremos restar 10 minutos a una fecha definida.


[code linenumbers=false syntax=gambas]
Public Sub Ejemplo2()
  
  Dim fechadefinida As Date
  Dim fechafinal As Date  
  
  fechadefinida = Date(2020, 06, 20, 0, 5, 0, 0)
  
  Print "La fecha definida es: " & Format(fechadefinida, "dd/mm/yyyy hh:nn:ss")
  
  fechafinal = DateAdd(fechadefinida, gb.Minute, -10)
  
  Print "Restamos diez minutos..."
  
  Print "La fecha final es: " & Format(fechafinal, "dd/mm/yyyy hh:nn:ss")
  
End
[/code]

Resultado:

[quote]
La fecha definida es: 20/06/2020 00:05:00
Restamos diez minutos...
La fecha final es: 19/06/2020 23:55:00
[/quote]

Saludos


-----------------------------------
calcena
Domingo, 05 Julio 2020, 12:27

Re: Restar Días A Una Fecha
-----------------------------------
Gracias a todos,
finalmente he hecho una cosa muy similar a lo que habéis propuesto. he tirando de la creación de una clase helper para la conversión y después si que me ha funcionado.

Por cierto gambafeliz, prueba tu ejemplo con un valor de días superior a 12, pruebalo con una fecha por ejempolo 15/07/2020 verás que no funciona justamente por lo que comentan los compañeros el formato es MM/DD/YYYY al menos cuando como yo, utitlizas un DateBox.


Saludos.


-----------------------------------
gambafeliz
Domingo, 05 Julio 2020, 14:24

Re: Restar Días A Una Fecha
-----------------------------------
[quote user="calcena" post="49038"]Gracias a todos,
finalmente he hecho una cosa muy similar a lo que habéis propuesto. he tirando de la creación de una clase helper para la conversión y después si que me ha funcionado.

Por cierto gambafeliz, prueba tu ejemplo con un valor de días superior a 12, pruebalo con una fecha por ejempolo 15/07/2020 verás que no funciona justamente por lo que comentan los compañeros el formato es MM/DD/YYYY al menos cuando como yo, utitlizas un DateBox.


Saludos.[/quote]

calcena no se a que te refieres, yo lo he probado y si me va. Eso si, no he probado el caso que me has planteado. Y es verdad que no pruebo casos como tu me has indicado. DateAdd solo lo uso para restar 1 día y poco más. Te sugiero que veas hilos donde yo discuto justo problemas como los que planteas, y normalmente lo hago con Shordi. Donde el me insiste que las fechas son número y como tal se deben tratar.

Me gustaría que me des con más exactitud tu opinión sobre justo lo que has escrito arriba y así mirarlo juntos. Yo ya me queme el coco en su día por temas como estos y en fin, creía que ya lo tenia claro, este tema. De echo incluso todo me funciona muy bien en mi aplicación.

Bueno ya me cuentas, saludos.


-----------------------------------
calcena
Domingo, 05 Julio 2020, 14:39

Re: Restar Días A Una Fecha
-----------------------------------
[quote user="gambafeliz" post="49039"][quote user="calcena" post="49038"]Gracias a todos,
finalmente he hecho una cosa muy similar a lo que habéis propuesto. he tirando de la creación de una clase helper para la conversión y después si que me ha funcionado.

Por cierto gambafeliz, prueba tu ejemplo con un valor de días superior a 12, pruebalo con una fecha por ejempolo 15/07/2020 verás que no funciona justamente por lo que comentan los compañeros el formato es MM/DD/YYYY al menos cuando como yo, utitlizas un DateBox.


Saludos.[/quote]

calcena no se a que te refieres, yo lo he probado y si me va. Eso si, no he probado el caso que me has planteado. Y es verdad que no pruebo casos como tu me has indicado. DateAdd solo lo uso para restar 1 día y poco más. Te sugiero que veas hilos donde yo discuto justo problemas como los que planteas, y normalmente lo hago con Shordi. Donde el me insiste que las fechas son número y como tal se deben tratar.

Me gustaría que me des con más exactitud tu opinión sobre justo lo que has escrito arriba y así mirarlo juntos. Yo ya me queme el coco en su día por temas como estos y en fin, creía que ya lo tenia claro, este tema. De echo incluso todo me funciona muy bien en mi aplicación.

Bueno ya me cuentas, saludos.[/quote]

En este sentido opino como Shordi, realmente la fecha juliana no deja de ser en número  entero de días:

"La fecha juliana, día juliano o DJ (JD, por sus siglas en inglés) es el número de días y fracción transcurridos desde el mediodía del 1º de enero del año 4713 a. C."

una vez tienes esos números pues es restar sumar etc ...el tema viene como siempre pasa sobre todo en SQL que las fechas tienen formato:
Francés, Inglés, Español, con horas minutos segundos .... esto complica este paso a fecha juliana.

Para mi aplicación lo que me ha funcionado es lo siguiente:


 dTempFecha = DateAdd(mHelpers.getFechaMMDDYYYY(dbFechaAviso.Text), gb.Day, -Val(txtDiasAviso.Text))
 arrAlerta.Add(Format(dTempFecha, "dd/mm/yyyy"))



La función mHelpersgetFechaMMDDYYY():
Public Function getFechaMMDDYYYY(ByRef sParamInput As String) As String
  
  sParamInput = Mid(sParamInput, 4, 2) & "/" & Mid(sParamInput, 1, 2) & "/" & Mid(sParamInput, 7, 4)  
  Return sParamInput  
End


Saludos.


-----------------------------------
gambafeliz
Domingo, 05 Julio 2020, 15:54

Re: Restar Días A Una Fecha
-----------------------------------
[quote user="calcena" post="49040"]
Para mi aplicación lo que me ha funcionado es lo siguiente:

 dTempFecha = DateAdd(mHelpers.getFechaMMDDYYYY(dbFechaAviso.Text), gb.Day, -Val(txtDiasAviso.Text))
 arrAlerta.Add(Format(dTempFecha, "dd/mm/yyyy"))
[/quote]

Voy a intentar entender tú código:
1era. linea:
Guardas en una variable de tipo Date, usas la función sumar Date donde tienes un modulo (mHelpers) con una función (getFecha) y le pasas supongo una fecha almacenada en una base de datos o manual (no se) y tampoco sé el formato, que te devuelve un Date en el formato MMDDYYYY(esto es lo que creía, pero he visto la función y devuelve String cosa que no entiendo porque no te da error por que DateAdd(Date,.....) y no String,  para después  restar x días de una caja de texto.
2a. linea: Guardas una cadena fecha tras convertirla desde un Date.

Opinión: Estas exactamente en los mismos problemas que yo ya tuve con las fechas y sinceramente lo estas resolviendo igual que yo. Incluso creé una clase llamada Fecha para resolver cada formato que tenia y tratarlo como a mi me interesaba. Osea, visualizar Fechas en pantalla con formato DD/MM/YYYY y lidiar con fechas MM/DD/YYYY así como trabajar de forma nativa con SQLite con sus formatos YYYY-MM-DD.

Por cierto esta anotación la tengo en mi código, por si te sirve de algo:
   ' Fecha según España: Día/Mes/Año
   ' Fecha según SQLite: Año-Mes-Día
   ' Fecha según Gambas: Día/Mes/Año pero al pasar a String es: Mes/Día/Año

[quote user="calcena" post="49040"]
La función mHelpersgetFechaMMDDYYY():
Public Function getFechaMMDDYYYY(ByRef sParamInput As String) As String
  
  sParamInput = Mid(sParamInput, 4, 2) & "/" & Mid(sParamInput, 1, 2) & "/" & Mid(sParamInput, 7, 4)  
  Return sParamInput  
End

Saludos.[/quote]


