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