Руководство по SQL. Функции даты.
Ниже приведён список важных функций, которые относятся к дате и времени. Все данные функции доступны для работы с помощью SQL.
Примеры, приведённые ниже предназначены для RDBMS MySQL.
| Name | Description |
|---|---|
| ADDDATE() | Добавляет дату |
| ADDTIME() | Добавляет время |
| CONVERT_TZ() | Конвертирует одну временную зону в другую. |
| CURDATE() | Возвращает текущую дату. |
| CURRENT_DATE(), CURRENT_DATE | То же самое, что и CURDATE. |
| CURTIME() | Возвращает текущее время |
| NOW() | Возвращает текущие дату и время. |
| CURRENT_TIME(), CURRENT_TIME | То же самое, что и NOW() |
| DATE_ADD() | Добавляет две даты |
| DATE_FORMAT() | Определяет формат даты |
| DATE_SUB() | Разбивает две даты |
| DATE() | Возвращает только дату (число, месяц, год) из даты. |
| DATEDIFF() | Разделяет две даты |
| DAY() | То же самое, что и DAYOFMONTH() |
| DAYNAME() | Возвращает имя дня недели. |
| DAYOFMONTH() | Возвращает день месяца |
| DAYOFWEEK() | Возвращает индекс аргумента дня недели |
| DAYOFYEAR() | Возвращает номер дня в году (1 – 366) |
| EXTRACT | Выдаёт часть даты |
| FROM_DAYS() | Конвертирует номер дня в дату. |
| FROM_UNIXTIME() | Форматирует дату в дата/время для UNIX систем. |
| HOUR() | Возвращает часы |
| LAST_DAY | Возвращает крайний день месяца. |
| LOCALTIME(), LOCALTIME | То же самое, что и NOW() |
| LOCALTIMESTAMP, LOCALTIMESTAMP() | То же самое, что и NOW() |
| MAKEDATE() | Создаёт дату из года и дня в году |
| MAKETIME | Создаёт время |
| MICROSECOND() | Возвращает микросекунды |
| MINUTE() | Возвращает только минуты |
| MONTH() | Возвращает только месяц |
| MONTHNAME() | Возвращает имя месяца |
| CURRENT_TIMESTAMP(), CURRENT_TIMESTAMP | Синоним для NOW() |
| PERIOD_ADD() | Добавляет период для в месяце-году. |
| PERIOD_DIFF() | Возвращает количество месяцев в периоде. |
| QUARTER() | Возвращает квартал |
| SEC_TO_TIME() | Конвертирует секунды в формат ‘ЧЧ:ММ:СС’ |
| SECOND() | Возвращает секунды (0 – 59) |
| STR_TO_DATE() | Конвертирует строку в дату |
| SUBDATE() | То же самое, что и DATE_SUB() Требует три аргумента |
| SUBTIME() | Разделяет время |
| SYSDATE() | Возвращает системное время |
| TIME_FORMAT() | Определяет формат времени |
| TIME_TO_SEC() | Конвертирует время в секунды |
| TIME() | Возвращает время. |
| TIMEDIFF() | Отделяет время |
| TIMESTAMP() | Возвращает текущие дату и время. |
| TIMESTAMPADD() | Добавляет период дата/время |
| IMESTAMPDIFF() | Отделяет интервал из дата/время |
| TO_DAYS() | Конвертирует дату в дни |
| UNIX_TIMESTAMP() | Возвращает дату/время для UNIX систем |
| UTC_DATE() | Возвращает дату UTC |
| UTC_TIME() | Возвращает время UTC |
| UTC_TIMESTAMP() | Возвращает дату/время UTC |
| WEEK() | Возвращает номер недели |
| WEEKDAY() | Возвращает индекс дня недели |
| WEEKOFYEAR() | Возвращает номер недели в году (1 – 53) |
| YEAR() | Возвращает год |
| YEARWEEK() | Возвращает год и неделю |
Примеры
Добавление даты (ADDDATE)
mysql> SELECT DATE_ADD('2016-06-30', INTERVAL 30 DAY); +-----------------------------------------+ | DATE_ADD('2016-06-30', INTERVAL 30 DAY) | +-----------------------------------------+ | 2016-07-30 | +-----------------------------------------+ 1 row in set (0.00 sec)
Добавление времени (ADDTIME)
mysql> SELECT ADDTIME('2016-06-06 23:59:59', '2 2:2:2.0'); +---------------------------------------------+ | ADDTIME('2016-06-06 23:59:59', '2 2:2:2.0') | +---------------------------------------------+ | 2016-06-09 02:02:01 | +---------------------------------------------+ 1 row in set (0.00 sec)
Конвертация временной зоны (CONVERT_TZ)
mysql> SELECT CONVERT_TZ('2004-01-01 12:00:00','+00:00','+03:00'); +-----------------------------------------------------+ | CONVERT_TZ('2004-01-01 12:00:00','+00:00','+03:00') | +-----------------------------------------------------+ | 2004-01-01 15:00:00 | +-----------------------------------------------------+ 1 row in set (0.00 sec)
Текущая дата (CURDATE())
mysql> SELECT CURDATE(); +------------+ | CURDATE() | +------------+ | 2016-06-04 | +------------+ 1 row in set (0.00 sec)
Текущее время (CURTIME())
mysql> SELECT CURTIME(); +-----------+ | CURTIME() | +-----------+ | 14:19:55 | +-----------+ 1 row in set (0.00 sec)
Дата (DATE)
mysql> SELECT DATE('2016-06-04 15:00:00'); +-----------------------------+ | DATE('2016-06-04 15:00:00') | +-----------------------------+ | 2016-06-04 | +-----------------------------+ 1 row in set (0.00 sec)
Разница во времени (DATEDIFF())
mysql> SELECT DATEDIFF ('2016-06-06 00:00:00', '1988-10-28 12:00:00'); +---------------------------------------------------------+ | DATEDIFF ('2016-06-06 00:00:00', '1988-10-28 12:00:00') | +---------------------------------------------------------+ | 10083 | +---------------------------------------------------------+ 1 row in set (0.00 sec)
Добавление даты (DATEADD(), DATE_SUB())
Данные функции обеспечивают арифметику дат. Мы можем добавить или отнять определённый интервал времени от определённой даты.
Ниже приведена таблица, в которой указаны возможные аргументы для интервалов:
| Значение | Ожидаемый формат |
| MICROSECOND | Микросекунды |
| SECOND | Секунды |
| MINUTE | Минуты |
| HOUR | Часы |
| DAY | Дни |
| WEEK | Недели |
| MONTH | Месяцы |
| QUARTER | Кварталы |
| YEAR | Годы |
| SECOND_MICROSECOND | ‘Секунды.Микросекунды’ |
| MINUTE_MICROSECOND | Минуты.Микросекунды’ |
| MINUTE_SECOND | ‘Минуты.Секунды’ |
| HOUR_MICROSECOND | ‘Часы.Микросекунды’ |
| HOUR_SECOND | ‘Часы.Секунды.Микросекунды’ |
| HOUR_MINUTE | ‘Часы.Минуты’ |
| DAY_MICROSECOND | ‘Дни.Микросекунды’ |
| DAY_SECOND | Дни.Часы.Минуты.Секунды |
| DAY_MINUTE | Дни.Часы.Минуты |
| DAY_HOUR | Дни.Часы |
| YEAR_MONTH | Года.Месяцы |
mysql> SELECT DATE_ADD('2016-06-04 20:00:00', INTERVAL '1:1' DAY_HOUR); +----------------------------------------------------------+ | DATE_ADD('2016-06-04 20:00:00', INTERVAL '1:1' DAY_HOUR) | +----------------------------------------------------------+ | 2016-06-05 21:00:00 | +----------------------------------------------------------+ 1 row in set (0.00 sec)
Формат даты
Формат даты определяется с помощью специальных символов.
Список таких символов приведён в таблице, которая находится ниже:
| Спецификатор | Описание |
| %a | Сокращённое имя дня недели |
| %b | Сокращённое имя месяца |
| %c | Номер месяца |
| %D | День месяца с английским суффиксом |
| %d | Номер дня в месяце (00 … 31) |
| %e | Номер дня в месяце (0 … 31) |
| %f | Микросекунды (000000 … 999999) |
| %H | Часы (00 … 23) |
| %h | Часы (01 … 12) |
| %I | Часы (01 … 12) |
| %i | Минуты (00 … 59) |
| %j | Дни года (001 … 366) |
| %k | Часы (00 … 23) |
| %l | Часы (1 … 12) |
| %M | Имя месяца |
| %m | Номер месяца |
| %p | AM или PM |
| %r | Время с использованием AM или PM |
| %S | Секунды (00 … 59) |
| %s | Секунды (00 … 59) |
| %T | Время (ЧЧ:ММ:СС) |
| %U | Неделя (00 … 53). Первый день недели – Воскресенье |
| %u | Неделя (00 … 53). Первый день недели – Понедельник |
| %V | Неделя (00 … 53). Первый день недели – Воскресенье. Используется с %X |
| %v | Неделя (00 … 53). Первый день недели – Понедельник. Используется с %x |
| %W | День недели |
| %w | День недели (0 – Воскресенье … 6 – Суббота) |
| %X | Год для недели. Воскресенье – первый день недели. Используется с %V |
| %x | Год для недели. Понедельник – первый день недели. Используется с %v |
| %Y | Год (YYYY) |
| %y | Год (YY) |
| %% | Символ .%. |
| %x | То же самое для любых элементов, указанных выше |
mysql> SELECT DATE_FORMAT ('2016-06-04 22:00:00', '%W %M %Y'); +-------------------------------------------------+ | DATE_FORMAT ('2016-06-04 22:00:00', '%W %M %Y') | +-------------------------------------------------+ | Saturday June 2016 | +-------------------------------------------------+ 1 row in set (0.00 sec)
Имя дня (DAYNAME())
mysql> SELECT DAYNAME('1988-10-28'); +-----------------------+ | DAYNAME('1988-10-28') | +-----------------------+ | Friday | +-----------------------+ 1 row in set (0.00 sec)
День месяца (DAYOFMONTH())
mysql> SELECT DAYOFMONTH('1988-10-28'); +--------------------------+ | DAYOFMONTH('1988-10-28') | +--------------------------+ | 28 | +--------------------------+ 1 row in set (0.01 sec)
День недели (DAYOFWEEK())
mysql> SELECT DAYOFWEEK('1988-10-28'); +-------------------------+ | DAYOFWEEK('1988-10-28') | +-------------------------+ | 6 | +-------------------------+ 1 row in set (0.00 sec)
День в году (DAYOFYEAR())
mysql> SELECT DAYOFYEAR('1988-10-28'); +-------------------------+ | DAYOFYEAR('1988-10-28') | +-------------------------+ | 302 | +-------------------------+ 1 row in set (0.00 sec)
Неделя (WEEK())
mysql> SELECT WEEK('1988-10-28'); +--------------------+ | WEEK('1988-10-28') | +--------------------+ | 43 | +--------------------+ 1 row in set (0.00 sec)
На этом мы заканчиваем изучение функций даты в языке SQL.
В следующей статье мы рассмотрим временные таблицы.
SQL Функции даты
Самой трудной частью при работе с датами, чтобы быть уверенным, что формат даты вы пытаетесь вставить, соответствует формату столбца даты в базе данных.
Функции даты MySQL
В следующей таблице перечислены наиболее важные встроенные функции даты в MySQL:
| функция | Описание |
|---|---|
| NOW() | Возвращает текущую дату и время |
| CURDATE() | Возвращает текущую дату |
| CURTIME() | Возвращает текущее время |
| DATE() | Извлечение даты часть даты или выражения даты / времени |
| EXTRACT() | Возвращает одну часть даты / времени |
| DATE_ADD() | Добавляет заданный интервал времени до даты |
| DATE_SUB() | Вычитает заданный интервал времени от даты |
| DATEDIFF() | Возвращает количество дней между двумя датами |
| DATE_FORMAT() | дата Отображение / времени данные в различных форматах |
SQL Дата сервера Функции
В следующей таблице перечислены наиболее важные встроенные функции даты в SQL Server:
| функция | Описание |
|---|---|
| GETDATE() | Возвращает текущую дату и время |
| DATEPART() | Возвращает одну часть даты / времени |
| DATEADD() | Добавляет или вычитает определенный интервал времени от даты |
| DATEDIFF() | Возвращает время между двумя датами |
| CONVERT() | дата Отображение / времени данные в различных форматах |
SQL Дата типы данных
MySQL поставляется со следующими типами данных для хранения даты или даты / значение времени в базе данных:
- ДАТА — формат YYYY-MM-DD
- DATETIME — формат: YYYY-MM-DD HH: MI: SS
- TIMESTAMP — формат: YYYY-MM-DD HH: MI: SS
- ГОД — формат YYYY или YY
SQL Server поставляется со следующими типами данных для хранения даты или даты / значение времени в базе данных:
- ДАТА — формат YYYY-MM-DD
- DATETIME — формат: YYYY-MM-DD HH: MI: SS
- SMALLDATETIME — формат: YYYY-MM-DD HH: MI: SS
- TIMESTAMP — формат: уникальный номер
Note: Типы даты выбраны для столбца при создании новой таблицы в базе данных!
Для обзора всех типов данных , доступных, перейдите к нашей полной Справочник по типам данных .
SQL Работа с датами
Вы можете сравнить две даты легко, если нет времени компонент участвует!
Предположим , мы имеем следующую «Orders» таблица:
| OrderId | ProductName | OrderDate |
|---|---|---|
| 1 | Geitost | 2008-11-11 |
| 2 | Camembert Pierrot | 2008-11-09 |
| 3 | Mozzarella di Giovanni | 2008-11-11 |
| 4 | Mascarpone Fabioli | 2008-10-29 |
Теперь мы хотим , чтобы выбрать записи с OrderDate из «2008-11-11» из приведенной выше таблицы.
Мы используем следующую ЗЕЬЕСТ:
SELECT * FROM Orders WHERE OrderDate=’2008-11-11′
Результат-набор будет выглядеть следующим образом:
| OrderId | ProductName | OrderDate |
|---|---|---|
| 1 | Geitost | 2008-11-11 |
| 3 | Mozzarella di Giovanni | 2008-11-11 |
Теперь предположим , что «Orders» таблица выглядит следующим образом (обратите внимание на компонент времени в «OrderDate» колонке):
| OrderId | ProductName | OrderDate |
|---|---|---|
| 1 | Geitost | 2008-11-11 13:23:44 |
| 2 | Камамбер Пьерро | 2008-11-09 15:45:21 |
| 3 | Моцарелла ди Джованни | 2008-11-11 11:12:01 |
| 4 | Маскарпоне Fabioli | 2008-10-29 14:56:59 |
Если мы используем один и тот же оператор SELECT, как описано выше:
SELECT * FROM Orders WHERE OrderDate=’2008-11-11′
мы не получим никакого результата! Это происходит потому, что запрос ищет только даты без времени части.
Tip: Если вы хотите сохранить ваши запросы простой и легкий в обслуживании, не позволяют компоненты времени ваши даты!
Как записать время в sql
Типы данных даты и времени
Столбцы данного типа используются для записи дат, времени и их комбинаций.
Типы данных DATETIME, DATE, TIME
Тип данных DATETIME используется для величин, содержащих информацию как о дате, так и о времени в формате ‘YYYY-MM-DD HH:MM:SS’
Тип данных DATE используется для величин с информацией только о дате в формате ‘YYYY-MM-DD’. Поддерживается диапазон величин от ‘1000-01-01’ до ‘9999-12-31’.
Тип данных TIME используется для хранения значений времени в формате HH.MM.SS[.ssss]
Тип данных YEAR
MySQL Server поддерживает однобайтный тип данных YEAR, предназначенный для представления значений года в формате YYYY. Диапазон возможных значений — от 1901 до 2155.
Величины типа YEAR могут быть заданы в различных форматах:
- Как четырехзначная строка в интервале значений от ‘1901’ до ‘2155’.
- Как четырехзначное число в интервале значений от 1901 до 2155.
- Как двухзначная строка в интервале значений от ’00’ до ’99’. Величины в интервалах от ’00’ до ’69’ и от ’70’ до ’99’ при этом преобразуются в величины YEAR в интервалах от 2000 до 2069 и от 1970 до 1999 соответственно.
- Как двухзначное число в интервале значений от 1 до 99. Величины в интервалах от 1 до 69 и от 70 до 99 при этом преобразуются в величины YEAR в интервалах от 2001 до 2069 и от 1970 до 1999 соответственно. Необходимо принять во внимание, что интервалы для двухзначных чисел и двухзначных строк несколько различаются, так как нельзя указать «ноль» непосредственно как число и интерпретировать его как 2000. Необходимо задать его как строку ‘0’ или ’00’, или же оно будет интерпретировано как 0000.
Недопустимые величины YEAR преобразуются в 0000.
Тип данных TIMESTAMP
Назначение типа данных timestamp в MS SQL Server и MySQL Server значительно отличается.
В языке Transcat SQL, используемом в MS SQL Server тип данных, TIMESTAMP представляет собой автоматически сформированные уникальные двоичные числа. При произведении любых изменений в строке значение TIMESTAMP будет обновлено. Таким образом, столбец типа TIMESTAMP можно использовать, чтобы определить, было ли произведено изменение какого-либо значения в строке с момента ее последнего считывания. В таблице может быть только один столбец типа TIMESTAMP.
В MySQL Server тип столбца TIMESTAMP используется для автоматической записи текущих даты и времени при выполнении операций вставки или обновления. Допускается наличие нескольких столбцов типа TIMESTAMP в таблице, но в этом случае автоматически обновляется только первый из них. Столбец типа TIMESTAMP можно установить в значение, отличное от текущих даты и времени путем явного указания значения столбца при выполнении операций вставке и обновлении данных.
Функции даты и времени в SQLite
Как известно, в базе данных SQLite нет типа данных для хранения даты или времени. Предполагается хранить дату и время либо в строковом поле, либо в виде числа, т.е. использовать один из трех вариантов:
- TEXT — Для хранения даты/времени в формате «YYYY-MM-DD HH:MM:SS.SSS» (подробнее см.ниже)
- REAL — Для записи даты/времени в виде числа — Юлианского дня
- INTEGER — Чтобы сохранить дату/время как время Unix (число секунд с 1970-01-01 00:00:00 UTC)
Так же хочу отметить, что если хранить дату/время в строковом виде и соблюдать правильный формат, то будут доступны операции сравнения, сортировка по полю с датой/временем, а так же будут корректно работать и функции, описанные ниже.
Функции даты и времени в SQLite
Для работы с датой и временем SQLite предлагает 5 встроенных функций:
- date(timestring, modifier, modifier, .)
- time(timestring, modifier, modifier, .)
- datetime(timestring, modifier, modifier, .)
- julianday(timestring, modifier, modifier, .)
- strftime(format, timestring, modifier, modifier, .)
Все пять функций даты и времени принимают в качестве аргумента строку времени. За строкой времени могут следовать один или несколько модификаторов. Функция strftime() function также принимает строку формата в качестве первого аргумента.
Функции даты и времени используют стандарт ISO-8601 для строк формата. Функция date() возвращает дату в формате: YYYY-MM-DD. Функция time() возвращает время в формате HH:MM:SS. Функция datetime() возвращает «YYYY-MM-DD HH:MM:SS». Функция julianday() возвращает Юлианский день — число дней, прошедших начиная с полудня понедельника, 1 января 4713 до н. э. юлианского календаря.
Функция strftime() возвращает дату, отформатированную в соответствии со строкой формата, указанной в качестве первого аргумента. Строка формата поддерживает основные замены, которые есть в функции strftime() из стандартной библиотеки C плюс еще 2 замены: %f и %J. Ниже список всех корректных замен функции strftime() в SQLite:
| %d | День месяца: 00 |
| %f | Доли секунды: SS.SSS |
| %H | час: 00-24 |
| %j | день года: 001-366 |
| %J | Юлианский день |
| %m | месяц: 01-12 |
| %M | минуты: 00-59 |
| %s | количество секунд с 1970-01-01 (unix timestamp) |
| %S | секунды: 00-59 |
| %w | день недели 0-6 где Воскресенье==0 |
| %W | неделя года: 00-53 |
| %Y | год: 0000-9999 |
| %% | % |
Обратите внимание, что все другие функции даты и времени могут быть выражены через strftime():
| Функция | Эквивалент strftime() |
| date(. ) | strftime(‘%Y-%m-%d’, . ) |
| time(. ) | strftime(‘%H:%M:%S’, . ) |
| datetime(. ) | strftime(‘%Y-%m-%d %H:%M:%S’, . ) |
| julianday(. ) | strftime(‘%J’, . ) |
Основная причина использования других функций вместо strftime() — это удобство и эффективность.
Строковое представление даты и времени в SQLite
Для того, чтобы SQlite правильно понимал и работал с датой (сортировал, сравнивал и т.д.), строка содержащая дату и время должна быть в одном из следующих форматов:
В форматах с 5 по 7 символ «T» означает разделитель даты и времени, как это требуется стандартом ISO-8601. В форматах с 8 по 10 указано только время, при этом считается, что дата равна 2000-01-01. Формат 11 — строка ‘now’ преобразуется в текущую дату и время как полученные методом xCurrentTime объекта sqlite3_vfs. Значение ‘now’ функций даты и времени всегда возвращают одно и то же значение для нескольких вызовов в пределах одного и того же sqlite3_step(). Формат 12 — это Юлианский день выраженный в виде дробного числа.
Обратите внимание: Функции даты и времени в SQLite используют Всемирное координированное время (UTC). Чтобы получить локальные дату и время, следует использовать модификатор localtime, например, чтобы получить текущую локальную дату и время, можно воспользоваться таким запросом:
select datetime(‘now’,’localtime’)
Форматы со 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 значащими цифрами, но функции даты/времени действительно принимают столько цифр, сколько необходимо для представления числа в юлианский день.
Модификаторы даты и времени
За строкой времени может следовать один или более модификаторов, изменяющих дату и/или время. Каждый модификатор — это преобразование, которое применяется к значению времени слева от него. Модификаторы применяются слева направо, порядок важен. Доступны следующие модификаторы.
- NNN days
- NNN hours
- NNN minutes
- NNN.NNNN seconds
- NNN months
- NNN years
- start of month
- start of year
- start of day
- weekday N
- unixepoch
- localtime
- utc
Первые шесть модификаторов (от 1 до 6) просто добавляют указанное количество времени к дате и времени, заданным предыдущим временем и модификаторами. Символ «s» в конце имен модификаторов является необязательным. Обратите внимание, что «±NNN months» работает путем преобразования оригинальной даты в формат YYYY-MM-DD, затем добавляется ±NNN месяцев к MM значению, затем результат нормализуется. Например, дата 2001-03-31 модифицированная с помощью ‘+1 month’ изначально дает 2001-04-31, но в апреле только 30 дней, поэтому дата нормализуется и становится 2001-05-01. Аналогичный эффект происходит когда дата February 29 високосного года и используется модификатор ±N years, где N не кратно четырем.
Модификаторы «start of» (с 7 по 9) сдвигает дату назад, на начало месяца, года или дня.
Модификатор «weekday» переносит дату вперед на следующую дату, где номер дня недели равен N. Воскресенье равно 0, Понедельник равен 1 и т.д.
Модификатор «unixepoch» (11) работает только в случае использования строки времени в формате DDDDDDDDDD. Этот модификатор заставляет dddddddddddd интерпретироваться не как номер Юлианского дня, как это обычно было бы, а как 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 times с -62167219200 до 106751991167).
Модификатор «localtime» (12) ожидает, что строка времени слева является UTC и настраивает строку времени так, чтобы она отображала локальное время. Если «localtime» получает строку времени не в UTC, тогда результат будет не корректным. Модификатор «utc» — противоположность модификатору «localtime». «utc» ожидает, что срока слева — локальное время и преобразует его в UTC. Если строка не будет локальным временем, тогда «utc» вернет некорректный результат.
Примеры использования функций даты/времени в SQLite
Определить текущую дату.
SELECT date(‘now’);
Вычислить последний день текущего месяца.
SELECT date(‘now’,’start of month’,’+1 month’,’-1 day’);
Вычислить дату и время имея на входе метку времени unix 1092941466.
SELECT datetime(1092941466, ‘unixepoch’);
Вычислить дату и время имея на входе метку времени unix 1092941466, и перевести его в локальное время.
SELECT datetime(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′);
Вычислить дату первого вторника октября текущего года.
SELECT date(‘now’,’start of year’,’+9 months’,’weekday 2′);
Вычислить время с эпохи unix в секундах (аналогично strftime(‘%s’,’now’) не считая дробной части):
SELECT (julianday(‘now’) — 2440587.5)*86400.0;
Предупреждения и ошибки
Вычисление местного времени в значительной степени зависит от прихоти политиков и, таким образом, трудно получить правильное время для всех часовых поясов. В этой реализации стандартная функция библиотеки C localtime_r() используется для вычисления местного времени. Функция localtime_r() обычно работает только в течение нескольких лет между 1970 и 2037. Для дат за пределами этого диапазона SQLite пытается сопоставить год с эквивалентным годом в пределах этого диапазона, выполнить расчет, а затем сопоставить год назад.
Все функции работают в пределах дат от 0000-01-01 00:00:00 до 9999-12-31 23:59:59 (юлианские дни от 1721059.5 до 5373484.5). Для даты вне этого диапазона, результаты этих функций не определены.
Не Vista платформы Windows поддерживают только один набор правил. Vista поддерживает только два. Поэтому на этих платформах исторические расчеты DST будут неверными. Например, в США, в 2007 году — правила перехода на летнее время изменились. Не Vista платформы Windows применят правила DST 2007 за все предыдущие годы. Vista делает несколько лучше получить результаты исправить обратно в 1986 году, когда правила были также изменены.
Все внутренние вычисления предполагают Григорианский календарь. Также предполагается, что каждый день содержит ровно 86400 секунд.