Разница между 2 датами в SQLite
Как я могу получить разницу в днях между 2 датами в SQLite? Я уже пробовал что-то вроде этого:
SELECT Date('now') - DateCreated FROM Payment
возвращает 0 каждый раз.
9 ответов:
оба ответа предлагаем решения немного сложнее, так как они требующий. Скажем, платеж был создан на
January 6, 2013
. И мы хотим знать разницу между этой датой и сегодняшним днем.sqlite> SELECT julianday() - julianday('2013-01-06'); 34.7978485878557
разница составляет 34 дня. Мы можем использовать
julianday('now')
для лучше ясность. Другими словами, нам не нужно ставитьdate()
илиdatetime()
функции как параметры кjulianday()
функция.
Разница В Днях
Select Cast (( JulianDay(ToDate) - JulianDay(FromDate) ) As Integer)
Разница В Часах
Select Cast (( JulianDay(ToDate) - JulianDay(FromDate) ) * 24 As Integer)
Разница В Минутах
Select Cast (( JulianDay(ToDate) - JulianDay(FromDate) ) * 24 * 60 As Integer)
Разница В Секундах
Select Cast (( JulianDay(ToDate) - JulianDay(FromDate) ) * 24 * 60 * 60 As Integer)
SQLite wiki-отличная ссылка и DateAndTimeFunctions страница является хорошим закладок. Также полезно помнить, что довольно легко играть с запросами с помощью утилиты командной строки sqlite:
sqlite> select julianday(datetime('now')); 2454788.09219907 sqlite> select datetime(julianday(datetime('now'))); 2008-11-17 14:13:55
этот ответ немного длинноват, и документация не скажет вам об этом (потому что они предполагают, что вы храните свои даты как даты UTC в базе данных), но ответ на этот вопрос во многом зависит от часового пояса, в котором хранятся ваши даты. Вы также не используете
Date('now')
, аjulianday()
функция, чтобы вычислить обе даты назад против общей даты, а затем вычесть разницу этих результатов друг от друга.если даты хранятся в Мирового:
SELECT julianday('now') - julianday(DateCreated) FROM Payment;
это то, что топ-рейтинг ответов, а также в документация. Это только часть картины, и очень упрощенный ответ, если вы спросите меня.
если ваши даты хранятся в местное время, используя приведенный выше код сделает ваш ответ неправильно по количеству часов ваш GMT смещение. Если вы находитесь в восточной части США, как я, который является GMT -5, ваш результат будет иметь 5 часов добавил на него. И если вы попробуете сделать
DateCreated
соответствует UTC, потому чтоjulianday('now')
идет против даты GMT:SELECT julianday('now') - julianday(DateCreated, 'utc') FROM Payment;
это имеет ошибку, где он добавит час для
DateCreated
то есть в летнее время (март-ноябрь). Скажем, что" сейчас " находится в полдень в день без DST, и вы создали что-то еще в июне (во время DST) в полдень, ваш результат даст 1 час, а не 0 часов, для части часов. Вам нужно будет написать функцию в коде вашего приложения, которая отображает результат, чтобы изменить результат и вычесть час из ДСТ даты. Я сделал это, пока не понял, что есть лучшее решение этой проблемы, что у меня было:SQLite против Oracle-расчет разницы дат-часывместо этого, как было указано мне, для дат, хранящихся в местном времени, сделайте оба совпадения с местным временем:
SELECT julianday('now', 'localtime') - julianday(DateCreated) FROM Payment;
или добавить
'Z'
местное время:julianday(datetime('now', 'localtime')||'Z') - julianday(CREATED_DATE||'Z')
оба они, кажется, компенсируют и не добавляют дополнительный час для ДСТ даты и сделайте прямое вычитание-так что элемент, созданный в полдень в день DST, при проверке в полдень в день без DST, не получит дополнительного часа при выполнении расчета.
и хотя я признаю, что большинство будет говорить не хранить даты по местному времени в своей базе данных, а хранить их в UTC, чтобы вы не сталкивались с этим, ну не каждое приложение имеет всемирную аудиторию, и не каждый программист хочет пройти преобразование каждой даты в своей системе в UTC и обратно каждый раз, когда они делают GET или SET в базе данных и занимаются выяснением, является ли что-то локальным или в UTC.
просто примечание для написания функций timeclock. Для тех, кто ищет часы работы, очень простое изменение этого получает часы плюс минуты отображаются в процентах от 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
Если вы хотите время в формате 00: 00: Я решил это так:
select strftime('%H:%M',CAST ((julianday(FinishTime) - julianday(StartTime)) AS REAL),'12:00') from something