SQLite, проверка високосного года и подсчет дней

#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 является ГГГГ-ММ-ДД.