Как писать даты в sql
Перейти к содержимому

Как писать даты в sql

  • автор:

Как писать даты в sql

The date and time data types for representing temporal values are DATE , TIME , DATETIME , TIMESTAMP , and YEAR .

For the DATE and DATETIME range descriptions, “ supported ” means that although earlier values might work, there is no guarantee.

MySQL permits fractional seconds for TIME , DATETIME , and TIMESTAMP values, with up to microseconds (6 digits) precision. To define a column that includes a fractional seconds part, use the syntax type_name ( fsp ) , where type_name is TIME , DATETIME , or TIMESTAMP , and fsp is the fractional seconds precision. For example:

The fsp value, if given, must be in the range 0 to 6. A value of 0 signifies that there is no fractional part. If omitted, the default precision is 0. (This differs from the standard SQL default of 6, for compatibility with previous MySQL versions.)

Any TIMESTAMP or DATETIME column in a table can have automatic initialization and updating properties; see Section 11.2.5, “Automatic Initialization and Updating for TIMESTAMP and DATETIME”.

A date. The supported range is ‘1000-01-01’ to ‘9999-12-31’ . MySQL displays DATE values in ‘ YYYY-MM-DD ‘ format, but permits assignment of values to DATE columns using either strings or numbers.

A date and time combination. The supported range is ‘1000-01-01 00:00:00.000000’ to ‘9999-12-31 23:59:59.999999’ . MySQL displays DATETIME values in ‘ YYYY-MM-DD hh:mm:ss [. fraction ]’ format, but permits assignment of values to DATETIME columns using either strings or numbers.

An optional fsp value in the range from 0 to 6 may be given to specify fractional seconds precision. A value of 0 signifies that there is no fractional part. If omitted, the default precision is 0.

Automatic initialization and updating to the current date and time for DATETIME columns can be specified using DEFAULT and ON UPDATE column definition clauses, as described in Section 11.2.5, “Automatic Initialization and Updating for TIMESTAMP and DATETIME”.

A timestamp. The range is ‘1970-01-01 00:00:01.000000’ UTC to ‘2038-01-19 03:14:07.999999’ UTC. TIMESTAMP values are stored as the number of seconds since the epoch ( ‘1970-01-01 00:00:00’ UTC). A TIMESTAMP cannot represent the value ‘1970-01-01 00:00:00’ because that is equivalent to 0 seconds from the epoch and the value 0 is reserved for representing ‘0000-00-00 00:00:00’ , the “ zero ” TIMESTAMP value.

An optional fsp value in the range from 0 to 6 may be given to specify fractional seconds precision. A value of 0 signifies that there is no fractional part. If omitted, the default precision is 0.

The way the server handles TIMESTAMP definitions depends on the value of the explicit_defaults_for_timestamp system variable (see Section 5.1.8, “Server System Variables”).

If explicit_defaults_for_timestamp is enabled, there is no automatic assignment of the DEFAULT CURRENT_TIMESTAMP or ON UPDATE CURRENT_TIMESTAMP attributes to any TIMESTAMP column. They must be included explicitly in the column definition. Also, any TIMESTAMP not explicitly declared as NOT NULL permits NULL values.

If explicit_defaults_for_timestamp is disabled, the server handles TIMESTAMP as follows:

Unless specified otherwise, the first TIMESTAMP column in a table is defined to be automatically set to the date and time of the most recent modification if not explicitly assigned a value. This makes TIMESTAMP useful for recording the timestamp of an INSERT or UPDATE operation. You can also set any TIMESTAMP column to the current date and time by assigning it a NULL value, unless it has been defined with the NULL attribute to permit NULL values.

Automatic initialization and updating to the current date and time can be specified using DEFAULT CURRENT_TIMESTAMP and ON UPDATE CURRENT_TIMESTAMP column definition clauses. By default, the first TIMESTAMP column has these properties, as previously noted. However, any TIMESTAMP column in a table can be defined to have these properties.

A time. The range is ‘-838:59:59.000000’ to ‘838:59:59.000000’ . MySQL displays TIME values in ‘ hh:mm:ss [. fraction ]’ format, but permits assignment of values to TIME columns using either strings or numbers.

An optional fsp value in the range from 0 to 6 may be given to specify fractional seconds precision. A value of 0 signifies that there is no fractional part. If omitted, the default precision is 0.

A year in 4-digit format. MySQL displays YEAR values in YYYY format, but permits assignment of values to YEAR columns using either strings or numbers. Values display as 1901 to 2155 , or 0000 .

For additional information about YEAR display format and interpretation of input values, see Section 11.2.4, “The YEAR Type”.

As of MySQL 8.0.19, the YEAR(4) data type with an explicit display width is deprecated; you should expect support for it to be removed in a future version of MySQL. Instead, use YEAR without a display width, which has the same meaning.

MySQL 8.0 does not support the 2-digit YEAR(2) data type permitted in older versions of MySQL. For instructions on converting to 4-digit YEAR , see 2-Digit YEAR(2) Limitations and Migrating to 4-Digit YEAR, in MySQL 5.7 Reference Manual.

The SUM() and AVG() aggregate functions do not work with temporal values. (They convert the values to numbers, losing everything after the first nonnumeric character.) To work around this problem, convert to numeric units, perform the aggregate operation, and convert back to a temporal value. Examples:

SQL — урок 2: Работа с датой и временем

Литералы служат для непосредственного представления данных, ниже приведен список
стандартных литерал:

  • целочисленные — 0, -34, 45;
  • вещественные — 0.0, -3.14, 3.23e-23;
  • строковые — ‘текст’, n’текст’, ‘don»t!’;
  • дата — DATE ‘2008-01-10’;
  • время — TIME ’15:12:56′;
  • временная отметка — TIMESTAMP ‘2008-02-14 13:32:02’;
  • логический тип — true, false;
  • пустое значение — null.

Двойной апостроф интерпретируется в строковой литерале как апостроф в тексте.

В MySQL для временных литерал строка должна быть заключена в скобки: DATE (‘2008-01-10’).

Формат даты по умолчанию обычно определяется настройкой БД. Продвинутые СУБД могут
автоматически определять некоторые форматы (DATE (‘2008.01.10’))
или как в Oracle имеют функцию преобразования (to_date(‘01.02.2003′,’dd.mm.yyyy’)).
Для упрощения во многих СУБД там, где подразумевается дата,
перед строкой необязательно ставить имя типа.

Интервал времени

Синтаксис и реализация интервалов отличается на разных СУБД.

Oracle

Данный тип разделен на два: интервал по годам и интервал по дням.
В первом случае можно указать точность интервала только до месяца (по умолчанию год).
Во втором случае до различных долей секунды. Кроме этого указывается точность значения
временных промежутков в количестве цифр. Если точность не совпадает, то выводится сообщение
об ошибке.

PostgreSQL

интервалы указываются в виде строки, в которой перечисляются значение и тип промежутка:

  • microsecond — микросекунды;
  • millisecond — милисекунды;
  • second — секунды;
  • minute — минуты;
  • hour — часы;
  • day — дни;
  • week — недели;
  • month — месяцы;
  • year — года;
  • century — век;
  • millennium — тысячелетие.

Слова можно употреблять и во множественном числе.
Если интервал начинается с дней, то можно использовать короткий формат строки как
в Oracle для дневных интервалов.

MySQL

Только сложные интервалы, состоящие из более одного типа промежутков, указываются в строке.
Для этих целей введены дополнительные по сравнению с PostgreSQL имена для промежутков:

  • second_microsecond — секунды и микросекунды, формат строки ‘s.m’;
  • minute_microsecond — минуты и микросекунды, формат строки ‘m.m’;
  • minute_second — минуты и секунды, формат строки ‘m:s’;
  • hour_microsecond — часы и микросекунды, формат строки ‘h.m’;
  • hour_second — часы, минуты и секунды, формат строки ‘h:m:s’;
  • hour_minute — часы и минуты, формат строки ‘h:m’;
  • day_microsecond — день и микросекунды, формат строки ‘d.m’;
  • day_second — дни, часы, минуты и секунды, формат строки ‘d h:m:s’;
  • day_minute — дни, часы и минуты, формат строки ‘d h:m’;
  • day_hour — дни и часы, формат строки ‘d h’;
  • year_month — года и месяцы, формат строки ‘y-m’.

MySQL интервалы используются в выражениях с временными типами данных,
использовать их в качестве конечного типа для столбцов запрещено.

Выражения и операции

Для построения выражений SQL включает стандартные операции, ряд дополнительных предикатов
(булевских конструкций) и функций. В MySQL для встроенных функций между именем и открывающей
скобкой не должно быть пробелов, иначе будет сообщение об отсутствии подобной функции в БД.
Oracle не поддерживает логические выражения в перечислении select.

cтроковые операции

|| — соединение строк, в некоторых СУБД операнды автоматически преобразуются в
строковый тип. В MS Access используется &

алгебраические операции

  • + — сложение;
  • — вычитание;
  • * — умножение;
  • / — деление;
  • mod — остаток от деления. Oracle: mod(6,2). MySql: 6 mod 2.

Операции + и — также используются при работе со временем и интервалами.
В Oracle и PostgreSQL возможна разница между датами.
Результат возвращается в виде интервала в днях. Ниже приведен пример добавления к дате
интервала.

Ко времени можно прибавлять целое число, но результат зависит от конкретной СУБД.

операции отношения

  • < — меньше;
  • <= — меньше либо равно;
  • > — больше;
  • >= — больше либо равно;
  • = — равно;
  • <>,!= — не равно;

логические операции и предикаты

  • and — логическое и;
  • or — логическое или;
  • nor — отрицание;
  • between — определяет, находится ли значение в указанном диапазоне:

выражение IN (значение1. значениеn)

В качестве множества значений может служить корректная выборка

условные выражения

  • case — условный оператор, имеющий следующий синтаксис:
  • decode(expr,s1,r1[,sn,rn][,defr]) — сравнивает выражение expr с каждым выражением si
    из списка. Если выражения равны то возвращается значение равное ri. Если ни одно
    из выражений в списке не равно expr, то возвращается defr или NULL, если defr не было указано.
    Эта функция доступна только в Oracle и в большинстве случае заменяет оператор CASE;
  • coalesce(arg1,…,argn) — возвращает первый аргумент в списке не равный null. Для двух
    аргументов в Oracle можно воспользоваться функцией nvl;
  • greatest(arg1,…,argn) — возвращает наибольший аргумент в списке;
  • least(arg1,…,argn) — возвращает наименьший аргумент в списке;
  • nullif((arg1,arg2) — возвращает null если два аргумента равны, иначе первый
    аргумент.

Ниже приведен пример использования выражения в запросе выбора данных.

прочие операции

В каждой СУБД свой набор операций, выше были приведены наиболее употребительные.
Например, в PosgreSQL можно использовать и такие операции:

  • ^ — возведение в степень;
  • |/ — квадратный корень;
  • ||/ — кубический корень;
  • ! — постфиксный факториал;
  • !! — префиксный факториал;
  • @ — абсолютное значение.

Обзор функций

В арсенале каждой СУБД обязательно имеется набор встроенных функций для
обработки стандартных типов данных. В MySQL для встроенных функций между именем и
открывающей скобкой не должно быть пробелов, иначе будет сообщение об отсутствии подобной
функции в БД. В некоторых СУБД, как Oracle, если функция не имеет аргументов,
то скобки можно опустить.

математические функции

  • abs(x) — абсолютное значение;
  • ceil(x) — наименьшее целое, которое не меньше аргумента;
  • exp(x) — экспонента;
  • floor(x) — наибольшее целое, которое не больше аргумента;
  • ln(x) — натуральный логарифм;
  • power(x, y) — возводит x в степень y;
  • round(x [,y]) — округление x до y разрядов справа от десятичной точки. По умолчанию
    y равно 0;
  • sign(x) — возвращает -1 для отрицательных значений x и 1 для положительных;
  • sqrt(x) — квадратный корень;
  • trunc(x [,y]) — усекает x до у десятичных разрядов. Если у равно 0
    (значение по умолчанию), то х усекается до целого числа. Если у меньше 0, от отбрасываются
    цифры слева от десятичной точки.

Тригонометрические функции работают с радианами:

  • acos(x) — арккосинус;
  • asin(x) — арксинус;
  • atan(x) — арктангенс;
  • cos(x) — косинус;
  • sin(x) — синус;
  • tan(x) — тангенс.

строковые функции

  • ascii(string) — возвращает код первого символа, эта функция обратна функции CHR;
  • chr(x) — возвращает символ с номером х, в MySQL это функция char;
  • length(string) — возвращает длину строки;
  • lower(string) — понижает регистр букв;
  • upper(string) — повышает регистр букв;
  • ltrim(string1[, string2]) — удаляет слева из первой строки все символы
    встречающиеся во второй строке. Если вторая строка отсутствует, то удаляются пробелы. В MySQL
    второй аргумент не поддерживается;
  • rtrim(string1[, string2]) — аналогична функции ltrim, только удаление
    происходит справа;
  • trim(string) — удаляет пробелы с обоих концов строки;
  • lpad(string1, n[, string2]) — дополняет первую строку слева n символами из
    второй строки, при необходимости вторая строка дублируется. Если string2 не указана, то
    используется пробел;
  • rpad(string1, n[, string2]) — аналогична функции lpad, только присоединение
    происходит справа;
  • replace(string1, c1, c2) — заменяет все вхождения символа/подстроки c1 на c2.
    Для простого удаления всех вхождений c1, в качестве третьего аргумента надо указать пустую
    строку (»). В Oracle третий аргумент не обязателен, и по умолчанию равен пустой строке;
  • instr(string1, string2[, a][, b]) — возвращает b вхождение строки string2
    в строке string1 начиная с позиции a. Если a отрицательно, то поиск происходит справа. По
    умолчанию a и b присваиваются значение 1. В MySQL последние два аргумента не поддерживаются. В
    PostgreSQL данной функции нет, однако ее реализация дана в документации, как раз для
    совместимости с Oracle;
  • substr(string, pos, len) — возвращает подстрку с позиции pos и длины len.

работа с датами

В рассматриваемых СУБД для обработки времени мало общего. Самый минимум у Oraсle:

  • current_date — глобальная переменная содержащая текущую дату. Можно использовать и в других СУБД;
  • trunc(d,s) — приводит дату к началу указанной временной отметки, например к началу месяца.
    В PostgreSQL есть аналогичная функция date_trunc(s,d). В MySQL для этих целей может
    использоваться функция date_format(d,s), но она возвращает результат в виде строки;
  • add_months(d,n) — добавляет к дате указанное число месяцев;
  • last_day(d) — последний день месяца, содержащегося в аргументе;
  • months_between(d1,d2) — возвращает число месяцев между датами.

Ниже приведены допустимые форматы в строковом параметре s для функций trunc и date_trunc соответственно:

  • квартал — q, quarter;
  • год — yyyy, year;
  • месяц — mm, month;
  • неделя — ww, week;
  • день — dd, day;
  • час — hh, hour;
  • минута — mi, minute.

Такие функции как last_day в других СУБД реализуются с помощью арифметики времени и преобразования типов.
Так что при желании можно написать соответствующую функцию. Ниже приведена выборка последнего дня указанной даты.

Преобразование типов

Множество типов разрешенные для преобразования в констркуции CAST AS определяется
реализацией СУБД. Так в MySQL может преобразовать только следующие типы: binary[(n)],
char[(n)], date, datetime, decimal[(m[,d])], signed [integer], time, unsigned [integer].
А в Oracle, кроме преобразования встроенных типов, можно преобразовывать выборки со
множеством записей в массивы.

В PostgreSQL более расширенные возможности по преобразованию. Во-первых, можно добавить
собственное преобразование для встроенных и пользовательских типов. Во-вторых, есть
собственный более удобный оператор преобразования типов .

В большинстве случае необходимо преобразование в строку либо из строки. Для этого случаяСУБД предоставляют дополнительные функции.

функции Oracle

  • to_char(date [,format[,nlsparams]]) — дату в строку;
  • to_char(number [,format[,nlsparams]]) — число в строку;
  • to_date(string[,format[,nlsparams]]) — строку в дату;
  • to_number( string [ ,format[, nlsparams] ]) — строку в число;
  • to_timestamp(string, format) — строку во время.

В этих функциях format описание формата даты или числа, а nlsparams — национальные
параметры. Формат строки для даты задается следующими элементами:

  • «» — вставляет указанный в ковычках текст;
  • AD, A.D. — вставляет AD с точками или без точек;
  • ВС, B.C. — вставляет ВС с точками или без точек;
  • СС, SCC — вставляет век, SCC возвращает даты ВС как отрицательные числа;
  • D — вставляет день недели;
  • DAY — вставляет имя дня, дополненное пробелами до длины в девять символов;
  • DD — вставляет день месяца;
  • DDD — вставляет день года;
  • DY1 — вставляет сокращенное название дня;
  • FF2 — вставляет доли секунд вне зависимости от системы счисления;
  • НН, НН12 — вставляет час дня (от 1 до 12);
  • НН24 — вставляет час дня (от 0 до 23);
  • MI — вставляет минуты;
  • MM — вставляет номер месяца;
  • MOMn — вставляет сокращенное название месяца;
  • MONTHn — вставляет название месяца, дополненное пробелами до девяти символов;
  • RM — вставляет месяц римскими цифрами;
  • RR — вставляет две последние цифры года;
  • RRRR — вставляет весь год;
  • SS — вставляет секунды;
  • SSSSS — вставляет число секунд с полуночи;
  • WW — вставляет номер недели года (неделя — 7 дней от первого числа, а не от понедельника до воскресенья);
  • W — вставляет номер недели месяца;
  • Y.YYY — вставляет год с запятой в указанной позиции;
  • YEAR, SYEAR — вставляет год, SYEAR возвращает даты ВС как отрицательные числа;
  • YYYY, SYYYY — вставляет год из четырех цифр, SYYYY возвращает даты ВС как отрицательные числа;
  • YYY, YY, Y — вставляет соответствующее число последних цифр года.

Формат числовой строки задается следующими элементами:

  • $ — вставляет знак доллара перед числом;
  • В — вставляет пробелы для целой части десятичного числа, если она равна нулю;
  • MI — вставляет знак минус в конце (например, ‘999.999mi’);
  • S — вставляет знак числа в начале или в конце (например,’s9999′ или ‘9999s’);
  • PR — записывает отрицательное число в уголвых скобках (например,’999.999pr’);
  • D — вставляет разделитель десятичной точки в указанной позиции (например, ‘999D999’);
  • G — вставляет групповой разделитель в указанной позиции (например,’9G999G999′). При этом дробная часть числа отбрасывается;
  • С — вставляет ISO идентификатор валюты в начале или в конце числа (например, ‘с9999’ или ‘9999с’);
  • L — вставляет локальный символ валюты в в начале или в конце числа (например, ‘l9999’ или ‘9999l’);
  • , — вставляет запятую в указанной позиции вне зависимости от группового разделителя;
  • . — вставляет десятичную точку в указанной позиции вне зависимости от разделителя десятичной точки;
  • V — возвращает значение, умноженное на 10^n, где n равно числу девяток после V. В случае необходимости это значение округляется;
  • ЕЕЕЕ — 9.99ЕЕЕЕ возвращает значение в экспоненциальной форме записи;
  • RM — RM значение будет записано римскими цифрами в верхнем регистре;
  • rm — rm значение будет записано римскими цифрами в нижнем регистре;
  • 0 — вставляет нули, вместо пробелов в начале строки или в конце, например,
    9990 вставляет нули, вместо пробелов в конце строки;
  • 9 — каждая 9 определяет значащую цифру.

функции PostgreSQL

  • to_char(timestamp, format) — время в строку;
  • to_char(interval, format) — интервал времени в строку;
  • to_char(number, format) — число в строку;
  • to_date(str, format) — строку в дату;
  • to_number(str, format) — строку в число;
  • to_timestamp(str, format) — строку во время.

Основные элементы форматирования совпадают с Oracle.

функции MySQL

При хранении даты в MySQL под типом Date (), она имеет формат 2011-07-11 (год-месяц-день). В некоторых случаях даже не имея разделителя 20110711.

Поскольку в русскоязычных странах более привычным к восприятию считается формат 11.07.2011 (день.месяц.год), то при выводе даты из базы данных, возникает необходимость в её преобразовании.

Преобразовать дату можно несколькими способами.

  1. при помощи php кода
  2. воспользовавшись командой DATE_FORMAT () при выборке из базы.

Первый способ применяется в тех случаях, когда необходимо вывести небольшое количество записей или же когда разработчик не подозревает о существовании второго способа.

Второй способ применим во всех случаях, вне зависимости сколько записей необходимо извлечь из базы, при этом он осуществляет минимальную нагрузку на сервер в отличии от способа с php кодом.

Рассмотрим пример выполнения:

Допустим существует таблица message , которая содержит ячейку send_data с датой в формате 2011-07-11 .

Для извлечения и преобразования даты напишем следующий код:

$message = mysql_fetch_array(mysql_query("SELECT DATE_FORMAT(send_data, '%e.%m.%Y') FROM message"));

Далее в том месте где необходимо вывести преобразованную дату, выводим массив $message любой, удобной для вас командой:

к примеру если в send_data находится 2011-05-03 то мы получим 03.05.2011 .

Номер индекса в массиве $message указываем каким по счету начиная от 0, в команде SELECT извлекается необходимое значение с преобразованной датой. К примеру при запросе:

$message = mysql_fetch_array(mysql_query("SELECT title, text, DATE_FORMAT(send_data, '%e.%m.%Y') FROM message"));

вывод даты будет осуществляться с индексом 2:

Преобразовать дату при помощи DATE_FORMAT() можно в любой вид и очередность при помощи подстановки ключей.

  • date_format(date,format) — дату в строку;
  • time_format(time,format) — время в строку;
  • format(number,precision) — число в cтроку типа ‘#,###,###.##’,
    где число знаков определяется вторым аргументом.

Ниже приведен список основных элементов форматирования для даты и времени:

Особенности работы с MS SQL дата

Microsoft SQL дата имеет огромное значение. Не зная ее основ, невозможно преуспеть ни в одном проекте. Предлагаем вспомнить основные термины, поговорить об особенностях работы с ними. Для тех, кто не знаком с этими понятиями в SQL Server, данная статья – прекрасный повод выучить их.

Почему важно разбираться

MS SQL дата применяется для хранения в базе данных различный сведений, связанных с понятиями даты и времени. Таковыми являются сведения, когда добавлялись или удалялись какие-либо данные, регистрировались пользователи, осуществлялась авторизация и т.д.

Эти значения очень важны в MS SQL Server. Невозможно достичь успеха ни в одном проекте, не зная операторов MS SQL дата. С ними приходится работать во всех сервисах. Чаще всего, это определение временных интервалов между определенными датами.

В SQL существует большое количество функций, которые связаны с этим типом данных. Поговорим о них подробнее.

Используемые функции даты

Воспользовавшись специальными функциями, можно получить текущие (Current) значения:

  • NOW() – пары даты и времени;
  • CURDATE() — возвращает текущую дату (Missing Time);
  • CURTIME() — исключительно время (Missing Date).

Вышеперечисленные функции чаще всего применяются для внесения записей в БД и сохранения даты, когда это было сделано. Хороший пример – при добавлении заметки на сайт необходимо сохранить, когда была размещена публикация.

Операторы

Для применения MS SQL дата необходимо разбираться в операторах:

  • DATE_FORMAT() — для разных способов вывода сведений о времени.

Указывает из чего состоит:

  • DATE() — из даты со временем.
  • DATEDIFF() — временного отрезка между определенными датами.
  • EXTRACT() — единого значения даты/времени.
  • DATE_ADD() — добавления определенного количества единиц времени до выборки;
  • DATE_SUB() — вычисления указанного интервала от даты.

Популярные операции с ms sql дата

Рассмотрим наиболее популярные операции, осуществляемые с датами (Dates) и временем (Time):

Функция Выполняет действия Примечание
ADDDATE (date, INTERVAL value) Процесс сложения даты (date) и определенного значения (value) Value – любая единица измерения времени (в годах, кварталах, месяцах, неделях, днях, часах, минутах, секундах)
SUBDATE (date, INTERVAL value) Процесс вычитания из даты date значения value
PERIOD_ADD (period, n) Сложение значения period с n-ным количеством месяцев
TIMESTAMPADD (interval, n, date) Сложение даты date с n-ным временным интервалом interval Interval – те же единицы измерения, что и для value в ADDDATE (включая микросекунды)
SUBTIME (date, time). Вычитание из даты date определенного временного интервала time

Функции подсчета интервала

В таблице представлены специальные функции для нахождения интервалов между определенными датами:

Функция Выполняет действия Примечание
TIMEDIFF (date1, date2) Определяет разницу между date1 и date2 Результат представлен в часах, минутах, секундах
DATEDIFF (date1, date2) Высчитывает разницу между date1 и date2 Результат выдает в днях. Она поможет подсчитать число дней от любой даты
PERIOD_DIFF (period1, period2) Находит разницу между периодами period1 и period2 Выражается в месяцах. Необходимо, чтобы параметр период имел дату в формате YYYYMM
TIMESTAMPDIFF (interval, date1, date2) Находит разницу между date1 и date2 Выражается в тех единицах, что и interval, который соответствует аналогичному interval в TIMESTAMPADD

Функции вычисления разных значений в SQL Server и иной полезной информации

В SQL Server существуют специальные функции, с помощью которых можно найти много полезной информации. Часть их представлена в таблице:

Функция Возвращает значение Примечание
DATE (datetime) Текущей (Current) даты Missing Time
TIME (datetime) Времени Missing Date
TIMESTAMP (date) Полного значения даты вместе со временем
DAY (date)/ DAYOFMONTH (date) Порядкового номера определенного дня в месяце Являются синонимами, поэтому можно использовать любую
DAYNAME (date) Наименования дня недели
DAYOFWEEK (date) Выражение дня в неделе в цифрах Отсчет начинается в воскресенье (1) и заканчивается в субботу (7)
WEEKDAY (date) Цифрового значения дня в неделе Отсчет начинается в понедельник (0) и заканчивается в воскресенье (6)
WEEK (date) Цифрового значения недели в году Воскресенье – первый день недели
WEEKOFYEAR (datetime) Цифрового значения недели в году Понедельник – первый день недели
MONTH (date) Цифрового значения месяца в году
MONTHNAME (date) Наименования месяца
QUARTER (date) Цифрового значения квартала в году
YEAR (date) Года 1000 – 9999
DAYOFYEAR (date) Порядкового номера дня в календарном году
HOUR (datetime) Часа
MINUTE (datetime) Минут
SECOND (datetime) Секунд
EXTRACT (type FROM date) Части даты date, которая определена параметром type
TO_DAYS (date) Даты, преобразованной в число дней, которые прошли с нулевого года
FROM_DAYS (n) Число дней, которые прошли с нулевого года Эта и предыдущая ф-ция взаимообратны
UNIX_TIMESTAMP (date) Перевода даты в секунды, которые прошли с 01.01.1970г.
FROM_UNIXTIME (n) Число секунд, которые прошли с 01.01.1970г., переведенных в дату Эта и предыдущая ф-ция взаимообратны
TIME_TO_SEC (time) Перевода времени в число секунд, которые прошли с начала суток
SEC_TO_TIME (n) Числа секунд, которые прошли с начала суток, конвертированные в привычный формат времени Эта и предыдущая ф-ция взаимообратны
MAKEDATE (year, n) Даты, полученной путем преобразования года year и порядкового номера n дня в году

Возможные ошибки в работе

Рассмотрим самые распространенные ошибки, которые встречаются при работе с MS SQL дата и время в SQL Server.

1. Как хранятся значения?

Большинство ошибок связано с тем, что разработчики не до конца понимают способы хранения MS SQL даты и времени в MS SQL Server. Проблема в том, что даже документация не даст ответов на этот вопрос, т.к. не раскрывает эту тему полностью.

Некоторые T-SQL-разработчики, только начинающие свой профессиональный путь, полагают, что данные значения сохраняются в виде, привычном для человека («01-07-2021 11:15:22.167»). Однако это ошибочное мнение. Способ хранения MS SQL дата зависит от типа данных и может выражаться одним или несколькими целыми числами. Более понятно – дата/время хранится в виде чисел. Мнение, что они хранятся в форматированных строках – ошибочно.

Рассмотрим тип DATETIME. Согласно инструкций SQL Server данное значение сохраняется двумя целыми числами размеров в 8 байт (каждый по 4 байта):

  • в первом – указывается день в диапазоне от 01.01.1753г. до 31.12.9999г.;
  • во втором – указывается время в диапазоне от 00:00:00.000 до 23:59:59.997.

На это стоит обратить особое внимание. По умолчанию (нулевым днем) является значение 1 января 1900 года (1900-01-01 00:00:00.000). Отсюда следует, что даты раньше принятой, будут отрицательными числами, а позже – положительными. Так, 31.12.1899г. примет отрицательное значение (-1-й день), а 31.12.1900г. – положительное (364-й день).

Для хранения значения дата/время его нужно конвертировать в тип VARBINARY. А чтобы потом увидеть только дату либо только время, следует воспользоваться функцией SUBSTRING.

Проблемы могут возникнуть при указании различных языков (languages) и формата значений. Для корректной работы значение должно иметь структуру (Structure): YYYY-MM-DD HH при выбранном языке (language) British.

2. Помнить о тех, кто живет в иных географических широтах

Довольно распространенная ошибка – конфигурация установленного экземпляра SQL Server для обслуживания лишь локальных потребителей. Это может стать причиной проблем при работе с этим типом данных.

Как сказано выше, SQL Server сохраняет SQL даты в виде целых чисел. Однако частенько конвертирует их, переводя из целых чисел в формат строк, более привычных для человека. Потому в SQL Server принято несколько правил и параметров, которые и определяют порядок интерпретации значений строк даты/время.

3. Не позабыть о тех, кто живет в иных часовых поясах

При разработке приложений, которые охватывают не один регион в плане географии, разработчикам приходится сталкиваться с рядом проблем из-за часовых поясов. Неоднозначность таких типов данных – одна из них. Указанная SQL дата со временем практически не имеет смысла, пока не предоставлен механизм, обеспечивающий контекст.

Чаще всего это не является проблемой. Но она имеет особое значение для некоторых критических процессов, а также систем отслеживания и мониторинга. Даже когда подобные механизмы и существуют, разработчики определяют решения для учета часовых поясов.

Проблема получила решение, когда в SQL Server 2008 были внедрены:

  • Data Type DATETIMEOFFSET. Его задача – упростить управление Date/Time. DATETIMEOFFSET в SQL Server сохраняет информацию, как и DATETIME2, а для часовых поясов (в отношении UTC) используется дополнительная пара байт;
  • SWITCHOFFSET (функция системная), чтобы иметь возможность менять часовые пояса значений DATETIMEOFFSET в SQL Server.

Потому начиная с использования SQL Server 2008, проблема часовых поясов частична решена. Но даже эти версии не смогли устранить еще одной проблемы – переходов на зимнее и летнее время. При осуществлении таких переходов, данные будут отражаться не верно.

Проблема для разработчиков состоит в следующем:

  • не все регионы осуществляют подобные переходы;
  • в регионах, которые осуществляют переходы, это происходит в разное время;
  • из-за изменения законодательной базы, определяющей данные переходы, регулярно изменяются числа, в которые они осуществляются. Далее это будет еще более непредсказуемо;
  • часовые пояса могут достаточно серьезно отличаться как в странах, так и в одном регионе или государстве.

А значит, чтобы обеспечить получение надежных значений даты/времени нельзя рассчитывать лишь на DATETIMEOFFSET. Смена поясов и практически лишенный управления переход между зимним и летним временем, создают проблему. Создаваемые приложения и аналитика обязаны включать логику, требующуюся для обработки подобных задач.

4. Что выбрать: DATETIME2 или DATETIME?

Многие T-SQL-разработчики не часто пользуются DATETIME2. Хотя он был представлен еще в SQL Server 2008, они используют привычную DATETIME. Однако это не совсем оправданно, т.к. DATETIME2 обладает рядом достоинств:

  • обладает более высокой точностью, т.к. для формата Time содержит после запятой до семи десятичных знаков, а DATETIME – лишь три. Здесь значения не округляются, а лишние обрезаются;
  • позволяет контролировать точность Time, т.к. можно установить точность. Это позволит отрезать лишние знаки и сделать результат чище;
  • если значение точности превышает 4, используется 8 байт, а если до 4, то занимает 6 байт. Это помогает экономить место, что особенно ценно при работе с огромными массивами данных;
  • позволяет работать со значительно большим диапазоном дат (с 1 января 0001 года). В то время как в значение DATETIME можно лишь с 01.01.1753г.

Отметим, что при использовании старых приложений и систем, внедрение DATETIME2 может стать проблематичным. Но в процессе появления новых, при условии работы в SQL Server 2008 и старше, гораздо удобнее применять DATETIME2. Исключением могут стать технологии, не способные обработать его.

5. Игнорирование округления

Необходимо соблюдать осторожность при использовании таких Data Type, как DATETIME и SMALLDATETIME. Округления могут привести к потере значительных временных промежутков. Их использование может спровоцировать получение данных, способных неожиданно отразиться на результатах.

Гораздо надежнее использовать DATETIME2, когда это возможно.

6. Выполнение лишней работы

Чтобы из полной даты отсечь время, до SQL Server 2008 нужно было приложить усилия. Однако в версии 2008 может использоваться тип DATE. С его помощью достаточно просто конвертировать DATETIME2 в DATE и получить необходимый итог: одну только дату без упоминания времени.

Если необходимо оставить только временной показатель, то исходную информацию следует конвертировать в Data Type TIME. В этом случае оператор SELECT позволит получить только время. Использование таких типов данных, как DATE и TIME – наилучшие способы получения отдельных значений из первоначальных дата/время.

Для обнуления также можно использовать указанные выше DATEDIFF и DATEADD.

7. Непонимание принципов работы функции DATEDIFF

При использовании функции DATEDIFF стоит проявить осмотрительность. В противном случае не избежать получения достаточно странных показателей.

В процессе определения числа часов/ минут, прошедших между двумя показателями, полученный результат может отличаться от настоящего в разы. Так, при разнице в 1 секунду, SELECT DATEDIFF может вернуть разницу в одном часе или одной минуте. Такой же будет разница с днями, месяцами и т.д.

Основная проблема не в самой функции DATEDIFF. А в непонимании основ ее работы. SQL Server обращает внимание только на указанную даты, не более. Потому, при указании месяца, сопоставляться будут годы с месяцами, но никак не больше. Разница может составлять одну секунду, но SQL Server на это не обратить внимание.

Для обхода данной ошибки можно спуститься на один уровень глубже необходимого. Так, чтобы узнать, сколько минут между выбранной парой дат, следует вычислить сколько секунд, а результат поделить на 60:

SELECT DATEDIFF(ss, @a, @b)/60.0000

Работа с MS SQL дата не представляет сложности. Вместо вычисления периодов с помощью PHP, можно выполнять эти действия еще при выполнении SQL запросов. Это позволит быстрее получать требуемую выборку данных. Вспоминайте либо изучайте материал по MS SQL дата. При возникновении вопросов – обязательно задавайте их.

SQL DATE

Самое сложное при работе с датами — это убедиться, что формат даты, которую вы пытаетесь вставить, совпадает с форматом столбца даты в базе данных.

Пока ваши данные содержат только часть даты, ваши запросы будут работать так, как и ожидалось. Однако, если задействована временная часть, все становится еще сложнее.

Типы данных даты

MySQL поставляется со следующими типами данных для хранения даты или значения даты/времени в базе данных:

  • DATE — формат YYYY-MM-DD
  • DATETIME — формат: YYYY-MM-DD HH:MI:SS
  • TIMESTAMP — формат: YYYY-MM-DD HH:MI:SS
  • YEAR — формат YYYY или YY

SQL Server поставляется со следующими типами данных для хранения даты или значения даты/времени в базе данных:

  • DATE — формат YYYY-MM-DD
  • DATETIME — формат: YYYY-MM-DD HH:MI:SS
  • SMALLDATETIME — формат: YYYY-MM-DD HH:MI:SS
  • TIMESTAMP — формат: уникальное число

Примечание: Типы дат выбираются для столбца при создании новой таблицы в базе данных!

Работа с датами

Вы можете легко сравнить две даты, если нет никакого компонента времени!

Предположим, что у нас есть следующая таблица «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

Теперь мы хотим выбрать записи с порядковым номером «2008-11-11» из приведенной выше таблицы.

Мы используем следующую инструкцию SELECT:

Результирующий набор будет выглядеть следующим образом:

OrderId ProductName OrderDate
1 Geitost 2008-11-11
3 Mozzarella di Giovanni 2008-11-11

Теперь предположим, что таблица «Orders» выглядит следующим образом (обратите внимание на компонент time в столбце «OrderDate»):

OrderId ProductName OrderDate
1 Geitost 2008-11-11 13:23:44
2 Camembert Pierrot 2008-11-09 15:45:21
3 Mozzarella di Giovanni 2008-11-11 11:12:01
4 Mascarpone Fabioli 2008-10-29 14:56:59

Если мы используем тот же оператор SELECT, что и выше:

Мы не получим никакого результата! Это происходит потому, что запрос ищет только даты без временной части.

Совет: Чтобы ваши запросы были простыми и удобными в обслуживании, не допускайте компонентов времени в ваших датах!

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *