#sqlite #leap-year
#sqlite #високосный год
Вопрос:
Я пытаюсь написать некоторый код sqlite, который проверит, включает ли диапазон дат 29 февраля, и если да, разделите общее количество прошедших дней на 366. В противном случае разделите на 365. Я включил только один из двух запросов, поскольку исправление одного по существу исправляет другое.
Спасибо за вашу помощь.
UPDATE table SET "Date Adjust" = (strftime('%Y-%m-%d',"End Date") -
strftime('%Y-%m-%d',"Start Date"))/366
WHERE "2020-02-29" BETWEEN strftime('%Y-%m-%d',"Start Date") AND strftime('%Y-%m-%d',"End Date")
Ответ №1:
Если вы хотите получить разницу в днях между 2 датами, вам не следует вычитать результат strftime()
.
Функция strftime()
возвращает форматированную дату в виде строки.
Вы можете использовать функцию julianday()
:
UPDATE tablename
SET "Date Adjust" =
(julianday('%Y-%m-%d',"End Date") - julianday('%Y-%m-%d',"Start Date")) /
(365 ("2020-02-29" BETWEEN strftime('%Y-%m-%d', "Start Date") AND strftime('%Y-%m-%d', "End Date")))
Возвращаемое значение julianday()
является числом с плавающей запятой, поэтому, если вы хотите получить результат в виде целого числа, вы можете округлить его с помощью функции ROUND()
.
Чтобы это утверждение сработало, ваши даты должны быть в единственном допустимом формате даты для SQLite, который есть YYYY-MM-DD
.
Приведенное выше утверждение будет работать в обоих случаях: високосный год или нет.
Комментарии:
1. Спасибо. Однако это не работает. Другие, более простые функции работают нормально, поэтому в функции что-то не так, хотя я не могу понять, что именно. Даты представляют собой текст в формате мм / дд / гггг, если это имеет значение
2. Понял мою проблему. Создание нового потока, поскольку это совершенно другая проблема
3. @HelpWithR вы не можете применять функции даты SQLite к датам в формате мм / дд / гггг. Единственным допустимым форматом даты в SQLite является ГГГГ-ММ-ДД.