Вопросы | sqlite

Разница между двумя датами в SQLite

Вопрос

Anonymous | 84147 просмотров | рейтинг: 0

Как узнать разницу в днях между двумя датами в SQLite? Я уже пробовал что-то вроде этого:

 SELECT Date(now) - DateCreated FROM Payment
 
Возвращает 0 каждый раз.



Ответы

converter42

+ 94 -
  SELECT julianday('now') - julianday(DateCreated) FROM Payment;
 

 


Fred

+ 20 -
Вики SQLite - отличный справочник, а страница DateAndTimeFunctions - хорошая закладка. Также полезно помнить, что довольно просто играть с запросами с помощью утилиты командной строки sqlite:
 sqlite> select julianday(datetime('now'));
2454788.09219907
sqlite> select datetime(julianday(datetime('now')));
2008-11-17 14:13:55
 

 


vapcguy

+ 2 -
Просто заметка для написания функций таймера. Для тех, кто ищет отработанные часы, очень простое изменение показывает, что часы плюс минуты показываются в процентах от 60, как этого хочет большинство компаний, занимающихся начислением заработной платы. 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
 

 


Gary

+ 4 -
Этот ответ немного запутан, и документация не скажет вам этого (поскольку они предполагают, что вы храните свои даты как даты UTC в базе данных), но ответ на этот вопрос во многом зависит от часового пояса, в котором ваши даты хранится в. Вы также не используете Date('now'), но используете функцию julianday(), чтобы вычислить обе даты по отношению к общей дате, а затем вычесть разница этих результатов друг от друга. Если ваши даты хранятся в UTC:
  SELECT julianday('now') - julianday(DateCreated) FROM Payment;
 

Это то, что есть в топовом ответе, а также в документации. Это только часть картины, и очень упрощенный ответ, если вы спросите меня. Если ваши даты хранятся по местному времени, использование приведенного выше кода сделает ваш ответ НЕПРАВИЛЬНЫМ на количество часов, в течение которых смещение по Гринвичу составляет. Если вы находитесь в восточной части США, как я, то есть по Гринвичу -5, ваш результат будет добавлен на 5 часов. И если вы попытаетесь привести DateCreated в соответствие с UTC, потому что julianday('now') идет против даты GMT:
 SELECT julianday('now') - julianday(DateCreated, 'utc') FROM Payment;
 

В ней есть ошибка, из-за которой добавляется час для DateCreated, который соответствует летнему времени (март-ноябрь). Предположим, что сейчас полдень в день, не относящийся к летнему времени, и вы создали что-то еще в июне (во время летнего времени) в полдень, ваш результат будет давать 1 час, а не 0 часов, для части часов. Вам нужно написать функцию в коде вашего приложения, которая отображает результат, чтобы изменить результат и вычесть час из дат летнего времени. Я делал это до тех пор, пока не понял, что есть лучшее решение этой проблемы: SQLite против Oracle - Расчет разницы дат - часы Вместо этого, как мне было указано, для дат, хранящихся по местному времени, сопоставьте оба значения с местным временем:
 SELECT julianday('now', 'localtime') - julianday(DateCreated) FROM Payment;
 

Или добавьте 'Z' к местному времени:
 julianday(datetime('now', 'localtime')||'Z') - julianday(CREATED_DATE||'Z')
 

Оба из них, похоже, компенсируют и не добавляют дополнительный час для дат летнего времени и делают прямое вычитание - так, чтобы элемент, созданный в полдень в день летнего времени, при проверке в полдень не в день летнего времени, не получал дополнительный час, когда выполняя расчет. И хотя я признаю, что большинство из них скажут: не храните даты по местному времени в вашей базе данных, а сохраняйте их в UTC, чтобы вы не столкнулись с этим, но далеко не каждое приложение имеет всемирную аудиторию, и не каждый программист хочет чтобы выполнить преобразование КАЖДОЙ даты в их системе в UTC и обратно каждый раз, когда они выполняют GET или SET в базе данных, и имеют дело с выяснением, является ли что-то локальным или в UTC.  


Rakesh Chaudhari

+ 0 -
Если вы хотите записи между днями,
 select count(col_Name) from dataset where cast(julianday("now")- julianday(_Last_updated) as int)<=0;
 

 


Yusril Maulidan Raji

+ 0 -
Учитывая, что ваш формат даты следующий: ГГГГ-ММ-ДД ЧЧ: ММ: СС, если вам нужно найти разницу между двумя датами в количестве месяцев: (strftime('%m', date1) + 12*strftime('%Y', date1)) - (strftime('%m', date2) + 12*strftime('%Y', date2))


converter42

+ 94 -
В моем случае я должен рассчитать разницу в минутах, а julianday() не дает точного значения. Вместо этого я использую strftime(): SELECT strftime('%s', [UserEnd]) - strftime('%s', [UserStart])) / 60 Обе даты конвертируются в unixtime (секунды), а затем вычитаются, чтобы получить значение в секундах между двумя датами. Затем разделите его на 60. https://www.sqlite.org/cvstrac/wiki?p=DateAndTimeFunctions


Теги

sqlite

Похожие вопросы:

SQLite против Oracle - Расчет разницы дат - часы