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


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

SELECT Date('now') - DateCreated FROM Payment

возвращает 0 каждый раз.

9 80

9 ответов:

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

оба ответа предлагаем решения немного сложнее, так как они требующий. Скажем, платеж был создан на 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

Если вы хотите записи между днями,

select count(col_Name) from dataset where cast(julianday("now")- julianday(_Last_updated) as int)<=0;

учитывая, что ваш формат даты следующий : "гггг-ММ-ДД чч:мм: СС", если вам нужно найти разницу между двумя датами в несколько месяцев :

(strftime('%m', date1) + 12*strftime('%Y', date1)) - (strftime('%m', date2) + 12*strftime('%Y', date2))