Мова запитів SQLite: функції дати і часу

  1. Строки часу
  2. Модифікатори
  3. Приклади
  4. Застереження та помилки

Малий. Швидко. Надійний.
Виберіть будь-яку три.

SQLite підтримує п'ять функцій дати і часу наступним чином:

  1. date ( timestring, modifier, modifier, ... )
  2. time ( timestring, modifier, modifier, ... )
  3. datetime ( timestring, modifier, modifier, ... )
  4. julianday ( timestring, modifier, modifier, ... )
  5. strftime ( формат, timestring, modifier, modifier, ... )

Всі п'ять функцій дати та часу приймають рядок часу як аргумент. За рядком часу йде нуль або більше модифікаторів. Функція strftime () також приймає форматний рядок як перший аргумент.

Функції дати і часу використовують підмножину IS0-8601 форматів дати і часу. Функція date () повертає дату в такому форматі: YYYY-MM-DD. Функція time () повертає час як HH: MM: SS. Функція datetime () повертає "YYYY-MM-DD HH: MM: SS". Функція julianday () повертає Юліанський день - кількість днів з полудня в Грінвічі 24 листопада 4714 р. до н.е. Пролептичний григоріанський календар ). Підпрограма strftime () повертає дату, відформатована відповідно до рядка формату, вказаного як перший аргумент. Рядок формату підтримує найпоширеніші заміни, знайдені в Функція strftime () зі стандартної бібліотеки C плюс дві нові заміни,% f і% J. Нижче наведено повний список дійсних замінок strftime ():

% d день місяця: 00% f дробові секунди: SS.SSS% H година: 00-24% j день року: 001-366% J номер юліанського дня% m місяць: 01-12% M хвилини: 00-59 % s секунд з 1970-01-01% S секунд: 00-59% w день тижня 0-6 з неділя == 0% W тиждень року: 00-53% Y рік: 0000-9999 %%%

Зверніть увагу, що всі інші функції дати і часу можуть бути виражені в термінах strftime ():

Функція Equivalent strftime () дата (...) strftime ('% Y-% m-% d', ...) час (...) strftime ('% H:% M:% S', ... ) datetime (...) strftime ('% Y-% m-% d% H:% M:% S', ...) julianday (...) strftime ('% J', ...)

Єдиною причиною для надання інших функцій, окрім strftime (), є зручність і ефективність.

Строки часу

Строка часу може бути у будь-якому з наступних форматів:

  1. YYYY-MM-DD
  2. YYYY-MM-DD HH: MM
  3. РРРР-ММ-ДДН ГГ: ММ: СС
  4. ГГГГ-ММ-ДДГ: ММ: С.С.С.С.
  5. YYYY-MM-DD T HH: MM
  6. YYYY-MM-DD T HH: MM: SS
  7. YYYY-MM-DD T HH: MM: SS.SSS
  8. HH: MM
  9. МГ: ММ: СС
  10. HH: MM: SS.SSS
  11. зараз
  12. DDDDDDDDDD

У форматах з 5 по 7 "T" є літеральним символом, що розділяє дату і час, як того вимагає ISO-8601 . Формати з 8 по 10, які вказують лише час, передбачають дату 2000-01-01. Формат 11, рядок "тепер", перетворюється на поточну дату і час, отримані з методу xCurrentTime sqlite3_vfs об'єкт у використанні. Аргумент "now" для функцій дати і часу завжди повертає точно таке ж значення для декількох викликів у межах одного і того ж sqlite3_step () дзвінка. Загальний координований час (UTC) використовується. Формат 12 - це Номер юліанського дня виражається як значення з плаваючою крапкою.

Формати з 2 по 10 можуть необов'язково супроводжуватися індикатором часової зони виду " [+ -] HH: MM " або просто " Z ". Функції дати і часу використовують UTC або "zulu" час всередині, і тому суфікс "Z" є не-оп. Будь-який ненульовий суфікс "HH: MM" вираховується з вказаної дати і часу для обчислення часу zulu. Наприклад, всі наступні рядки часу є еквівалентними:

2013-10-07 08: 23: 19.120
2013-10-07T08: 23: 19.120Z
2013-10-07 04: 23: 19.120-04: 00
2456572.84952685

У форматах 4, 7 і 10 значення дробових секунд SS.SSS може мати одну або кілька цифр, що відповідають десятковій точці. Тільки три цифри показані в прикладах, оскільки тільки перші три цифри є значущими для результату, але вхідний рядок може мати менше або більше трьох цифр, а функції дати / часу все ще будуть працювати правильно. Аналогічно, формат 12 відображається з 10 значущими цифрами, але функції дати / часу дійсно будуть приймати безліч або декілька цифр, необхідних для представлення номера джуліанського дня.

Модифікатори

За рядком часу може слідувати нуль або більше модифікаторів, які змінюють дату та / або час. Кожен модифікатор - це перетворення, яке застосовується до значення часу з лівого боку. Модифікатори застосовуються зліва направо; порядок важливий. Доступні модифікатори є наступними.

  1. NNN днів
  2. NNN годин
  3. NNN хвилин
  4. NNN.NNNN секунд
  5. NNN місяців
  6. NNN років
  7. початок місяця
  8. початок року
  9. початок дня
  10. День тижня N
  11. unixepoch
  12. місцевий час
  13. utc

Перші шість модифікаторів (від 1 до 6) просто додають вказану кількість часу до дати і часу, визначених попереднім тимчасовим показником і модифікаторами. Символ 's' в кінці імен модифікаторів є необов'язковим. Зауважимо, що "± NNN місяці" працює, передаючи початкову дату у формат YYYY-MM-DD, додаючи значення ± NNN до значення місяця ММ, потім нормалізуючи результат. Так, наприклад, дані 2001-03-31, змінені на «+1 місяць», спочатку дають 2001-04-31, але квітень має лише 30 днів, тому дата нормалізується до 2001-05-01. Подібний ефект спостерігається, коли вихідна дата 29 лютого передового року, а модифікатор ± N років, коли N не кратна чотирьом.

"Початок" модифікаторів (з 7 по 9) зміщують дату назад до початку поточного місяця, року або дня.

Модифікатор "день тижня", у разі необхідності, просуває дату вперед, на наступну дату, де номер дня тижня - N. Неділя - 0, понеділок - 1, і так далі. Якщо дата вже на потрібний день тижня, модифікатор "день тижня" залишає дату незмінною.

Модифікатор "unixepoch" (11) працює тільки, якщо він безпосередньо слідує за тимчасовим показником у форматі DDDDDDDDDD. Цей модифікатор призводить до того, що DDDDDDDDDD буде інтерпретовано не як номер юліанського дня, як зазвичай, а як Unix Time - кількість секунд, починаючи з 1970 року. Якщо модифікатор "unixepoch" не слідує за тимчасовою датою форми DDDDDDDDDD, яка виражає кількість секунд з 1970 року або якщо інші модифікатори відокремлюють модифікатор "unixepoch" від попереднього DDDDDDDDDD, то поведінка є невизначеною. Для версій SQLite до 3.16.0 (2017-01-02), модифікатор "unixepoch" працює тільки для дат між 0000-01-01 00:00:00 і 5352-11-01 10:52:47 (unix раз -62167219200 через 106751991167).

Модифікатор "localtime" (12) приймає рядок часу ліворуч у універсальному координованому часі (UTC) і регулює рядок часу, щоб відображати місцевий час. Якщо "localtime" слідує за часом, який не є UTC, то поведінка є невизначеною. Модифікатор "utc" є протилежним "localtime". "utc" припускає, що рядок ліворуч знаходиться в локальному часовому поясі і налаштовує цей рядок у UTC. Якщо попередній рядок не знаходиться в локальному часі, то результат "utc" не визначений.

Приклади

Обчислити поточну дату.

SELECT date ("тепер");

Обчисліть останній день поточного місяця.

Дата SELECT ("зараз", "початок місяця", "+ 1 місяць", "- 1 день");

Обчисліть дату й час, вказані в часовій мітці unix 1092941466.

SELECT дата (1092941466, "unixepoch");

Обчисліть дату й час, вказані в часовій мітці unix 1092941466, і компенсуйте місцевий часовий пояс.

SELECT дата (1092941466, 'unixepoch', 'localtime');

Обчислити поточну мітку UNIX.

SELECT strftime ('% s', 'now');

Обчислити кількість днів з моменту підписання Декларації незалежності США.

SELECT julianday ('now') - julianday ('1776-07-04');

Обчислити кількість секунд, починаючи з певного моменту 2004 року:

SELECT strftime ('% s', 'now') - strftime ('% s', '2004-01-01 02:34:56');

Обчисліть дату першого вівторка в жовтні поточного року.

Дата вибору ("зараз", "початок року", "+ 9 місяців", "день тижня 2");

Обчислити час, починаючи з епохи unix, у секундах (наприклад, strftime ('% s', 'now'), крім дробової частини):

SELECT (julianday ('now') - 2440587.5) * 86400.0;

Застереження та помилки

Обчислення місцевого часу в значній мірі залежить від примхи політиків і, таким чином, важко отримати правильні для всіх місцевостей. У цій реалізації стандартна бібліотечна функція C localtime_r () використовується для надання допомоги при обчисленні місцевого часу. Функція localtime_r () C зазвичай працює лише у період між 1970 та 2037 роками. Для дат за межами цього діапазону SQLite намагається відобразити рік у еквівалентний рік у межах цього діапазону, виконати обчислення, а потім відобразити рік назад.

Ці функції працюють тільки для дат між 0000-01-01 00:00:00 і 9999-12-31 23:59:59 (числа юліанських днів від 1721059.5 до 5373484.5). Для дат за межами цього діапазону результати цих функцій не визначені.

Платформи, що не належать Windows Vista, підтримують лише один набір правил літнього часу. Vista підтримує лише два. Таким чином, на цих платформах історичні DST розрахунки будуть невірними. Наприклад, у США в 2007 році змінилися правила DST. Платформи, що не належать Windows Vista, також застосовують нові правила літнього часу для всіх попередніх років. Vista значно краще отримує результати правильно до 1986 року, коли також змінилися правила.

Всі внутрішні обчислення беруть на себе Григоріанський календар системи. Передбачається також, що кожен день триває рівно 86400 секунд.