¿Cómo obtengo la diferencia en días entre 2 fechas en SQLite? Ya he intentado algo como esto:Diferencia entre 2 fechas en SQLite
SELECT Date('now') - DateCreated FROM Payment
Devuelve 0 cada vez.
¿Cómo obtengo la diferencia en días entre 2 fechas en SQLite? Ya he intentado algo como esto:Diferencia entre 2 fechas en SQLite
SELECT Date('now') - DateCreated FROM Payment
Devuelve 0 cada vez.
SELECT julianday('now') - julianday(DateCreated) FROM Payment;
El wiki de SQLite es una gran referencia y la página DateAndTimeFunctions es una buena opción para marcar. También es útil recordar que es bastante fácil de jugar con las consultas con la utilidad de línea de comandos sqlite:
sqlite> select julianday(datetime('now'));
2454788.09219907
sqlite> select datetime(julianday(datetime('now')));
2008-11-17 14:13:55
Ambas respuestas proporcionan soluciones un poco más complejo, ya que tienen que ser . Digamos que el pago se creó en January 6, 2013
. Y queremos saber la diferencia entre esta fecha y hoy.
sqlite> SELECT julianday() - julianday('2013-01-06');
34.7978485878557
La diferencia es 34 días. Podemos usar julianday('now')
para mejor claridad. En otras palabras, no es necesario poner date()
o datetime()
funciones como parámetros para julianday()
función.
Diferencia En Días
Select Cast ((
JulianDay(ToDate) - JulianDay(FromDate)
) As Integer)
diferencia de horas de
Select Cast ((
JulianDay(ToDate) - JulianDay(FromDate)
) * 24 As Integer)
Diferencia en minutos
Select Cast ((
JulianDay(ToDate) - JulianDay(FromDate)
) * 24 * 60 As Integer)
diferencia en segundos
Select Cast ((
JulianDay(ToDate) - JulianDay(FromDate)
) * 24 * 60 * 60 As Integer)
para sqlite versión 3.12.0 la expresión de conversión tiene AS TIPO dentro de los corchetes. p.ej. "Seleccione Transmitir (5.6 como entero);" https://www.sqlite.org/lang_expr.html#castexpr De lo contrario, ejemplos realmente útiles. – rob
Gracias @rob. Alguien me propuso editarme así antes. Pero cuando lo probé en Sqlitebrowser, no funcionaba. Tal vez por ser una versión anterior. Así que lo mantuve como está ... – Sayka
Acabo de utilizar SQLitebrowser y obtuve el error rob mencionado ... ¿Puedo editar su publicación en la redacción moderna? – Noumenon
Sólo una nota para escribir funciones reloj temporizador. Para aquellos que buscan horas trabajadas, un cambio muy simple de esto obtiene las horas más los minutos se muestran como un porcentaje de 60 ya que la mayoría de las compañías de nómina lo quiere.
CAST ((julianday(clockOUT) - julianday(clockIN)) * 24 AS REAL) AS HoursWorked
Clock In Clock Out HoursWorked
2016-08-07 11:56 2016-08-07 18:46 6.83333332836628
Una pequeña consulta, aunque :) – vapcguy
Esta respuesta es un poco largo aliento, y la documentación no se Esto le dirá (porque asumen que está almacenando sus fechas como fechas UTC en la base de datos), pero la respuesta a esta pregunta depende en gran medida de la zona horaria en la que están almacenadas sus fechas. Tampoco usa Date('now')
, pero use la función julianday()
, para calcular ambas fechas contra una fecha común, luego reste la diferencia de esos resultados entre sí.
Si las fechas se almacenan en UTC:
SELECT julianday('now') - julianday(DateCreated) FROM Payment;
Esto es lo que la respuesta mejor clasificado tiene, y está también en the documentation. Es solo una parte de la imagen, y una respuesta muy simplista, si me preguntas.
Si sus fechas se almacenan en la hora local, utilizando el código anterior su respuesta será INCORRECTA por el número de horas que su compensación GMT es. Si te encuentras en los Estados Unidos orientales como yo, que es GMT -5, tu resultado tendrá 5 horas añadidas. Y si se intenta hacer DateCreated
ajustarse a UTC porque julianday('now')
va en contra de una fecha GMT:
SELECT julianday('now') - julianday(DateCreated, 'utc') FROM Payment;
Esto tiene un error en el que se sumará una hora para un DateCreated
que es durante el horario de verano (marzo-noviembre). Diga que "ahora" es al mediodía en un día que no es horario de verano y creó algo en junio (durante el horario de verano) al mediodía, su resultado dará una hora de diferencia, en lugar de 0 horas, para la porción de horas. Debería escribir una función en el código de la aplicación que muestre el resultado para modificar el resultado y restar una hora de las fechas del horario de verano. Lo hice, hasta que me di cuenta de que hay una mejor solución a ese problema que estaba teniendo: SQLite vs. Oracle - Calculating date differences - hours
En su lugar, como se ha señalado a mí, para fechas almacenadas en hora local, hacer que ambos coincidan con la hora local:
SELECT julianday('now', 'localtime') - julianday(DateCreated) FROM Payment;
o anexar 'Z'
a la hora local:
julianday(datetime('now', 'localtime')||'Z') - julianday(CREATED_DATE||'Z')
Ambos parecen compensar y no aportan la hora extra para conocer las fechas de DST y hacer la resta recta - de modo que el tema creado a mediodía en un día el horario de verano, al verificar al mediodía en un no-DS T día, no tendrá una hora extra al realizar el cálculo.
Y aunque reconozco que la mayoría dirá que no almacene las fechas en la hora local en su base de datos, y que las almacene en UTC para que no se encuentre con esto, no todas las aplicaciones tienen una audiencia mundial, y no todos los programadores quieren pasar de CUALQUIER fecha en su sistema a UTC y viceversa cada vez que hacen un GET o SET en la base de datos y se ocupan de averiguar si algo es local o en UTC.
" Es solo una parte de la imagen, y una respuesta muy simple, si me preguntas ". Sí, tienes razón. Pero mi respuesta fue dada 3 minutos después de que él hizo su pregunta cuando la tuya llega dos años después. Simplista, pero ella parecía satisfacerlo. – Fred
@Fred Es suficiente. Pero en realidad terminó llevándome a dar un paseo, como describí anteriormente, y por eso no me ayudó. Quería asegurarme de que cualquier persona que vea esto en el futuro supiera exactamente lo que estaba sucediendo, para que no llegaran a los mismos escollos que yo - o, si lo hicieran, sabrían cómo salir de ellos. – vapcguy
Si desea vez en 00:00 Formato: lo solucioné así:
select strftime('%H:%M',CAST ((julianday(FinishTime) - julianday(StartTime)) AS REAL),'12:00') from something
Tenga en cuenta que a pesar de lo que el nombre de la función podría hacer pensar, esto tiene una granularidad más alta que día. Es un número de días, pero puede ser fraccionario. – lindes
Tenga en cuenta que julianday devuelve el número (fraccional) de 'días', es decir, períodos de 24 horas, desde * mediodía * UTC en la fecha de origen. Normalmente no es lo que necesita, a menos que viva 12 horas al oeste de Greenwich. P.ej. si vives en Londres, esta mañana es el mismo día de julio que ayer por la tarde. – JulianSymes
Funciona si su 'DateCreated' está en UTC. Si, en cambio, es la hora local, debe convertir 'julianday ('now')' a la hora local. No pude encontrar ningún lugar que tuviera esta información. Si lo hace 'julianday ('ahora') - julianday (DateCreated)' como sugiere esta publicación con una fecha almacenada en hora local, su respuesta estará desactivada por su desplazamiento desde GMT y será incorrecta. Aunque quizás no sea la mejor práctica para almacenar fechas en la hora local, aún puede suceder en aplicaciones donde las zonas horarias no importan (excepto cuando la herramienta con la que trabaja las obliga a hacerlo, como aquí). – vapcguy