Вычесть дату из даты
Есть ли вариант, как я могу получить верный ответ (85) одним действием?
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:
Вычесть дату из даты
Друзья, подскажите, пожалуйста. пример: Клиент родился 26.02.1983. мне нужно узнать сколько.
Преобразование даты в дату Access. очень нужно
Обычно я преобразовываю дату так: datetime = » & Request.Form(‘day’) & ‘/’ &.
Как из даты вычесть дату?
Продолжаю рисовать Вселенную, тема https://www.cyberforum.ru/cpp-beginners/thread258054.html (хотя.
Чего — то не получается вычесть из Даты Дату
Код такой: Private Sub Command1_Click() Dim Date1 As Date, Date2 As Date Dim DeltaDate As Date.
93 / 71 / 33
Регистрация: 02.08.2015
Сообщений: 202
Здравствуйте!
Не уверен, что понял, что Вам нужно. Но как вариант вычитания дат:
1 2 3 4 5 6
SELECT (TO_DATE('2018.12.10 15:47:20', 'yyyy.mm.dd hh24:mi:ss') - TO_DATE('2018.12.10 14:30:20', 'yyyy.mm.dd hh24:mi:ss')) * 24 * 60 AS minutes, (TO_DATE('2018.12.10 15:47:20', 'yyyy.mm.dd hh24:mi:ss') - TO_DATE('2018.12.10 14:30:20', 'yyyy.mm.dd hh24:mi:ss')) DAY TO SECOND AS full_time FROM dual;
Результат:
| MINUTES | FULL_TIME | |
| 1 | 77 | +00 01:17:00.000000 |
Как вычитать даты в sql
клоуны, вы хоть проверяйте соответствие задачи базе из нее! например, в 0430. постоянно какая-то дичь творится в условиях.
Anonymous #3322801 Уровень 79 Expert
25 октября 2023
Задачи понравились, но опять же есть что доработать. Как минимум предоставляемую таблицу и задание под нее. Очень часто имена колонок в таблице и в задании отличаются.
5 октября 2023
Поддерживаю , не работает ни хрена
MrFurion Уровень 31
27 августа 2023
можно писать запросы так как они выглядят в джава коде а не как в голову пришлось БРЕД
MrFurion Уровень 31
27 августа 2023
Что за лекция ни одного рабочего запроса.
Anonymous #3129578 Уровень 108
27 мая 2023
На task0430 понял, что структура таблицы не имеет ничего общего со скриптом init_data.sql
Ramazan Уровень 36 Expert
15 января 2023
В первом случае мы ищем дедлайны за последние 30 дней. Во втором — дедлайны за последние и за следующие 30 дней.
Николай Уровень 77 Expert
3 ноября 2022
«Подумай, почему в прошлый раз была одна строка, а в этот раз – три?» — потому что от даты дедлайна отнимаем текущую дату и если она меньше 30, то строка попадает в результат, правильно?
Nikita Shamrai Уровень 108 Expert
30 октября 2022
Тут хорошие задачи. Если бы еще последние предложения где подсказка какие функции использовать было скрыто — было бы супер
Сообщество
JavaRush — это интерактивный онлайн-курс по изучению Java-программирования c нуля. Он содержит 1200 практических задач с проверкой решения в один клик, необходимый минимум теории по основам Java и мотивирующие фишки, которые помогут пройти курс до конца: игры, опросы, интересные проекты и статьи об эффективном обучении и карьере Java‑девелопера.
Подписывайтесь
Язык интерфейса
«Программистами не рождаются» © 2023 JavaRush
Скачивайте наши приложения
«Программистами не рождаются» © 2023 JavaRush
Этот веб-сайт использует данные cookie, чтобы настроить персонально под вас работу сервиса. Используя веб-сайт, вы даете согласие на применение данных cookie. Больше подробностей — в нашем Пользовательском соглашении.
SQL — Функции даты
От автора: сегодня мы поговорим о том, как работают в SQL функции даты. В следующей таблице приведен список всех важных функций, связанных с датой и временем, которые доступны. Существуют и другие, поддерживаемые различными СУБД. Данный список представляет функции, доступные в СУБД MySQL.
ADDDATE(). Добавляет даты
ADDTIME(). Добавляет время
CONVERT_TZ(). Преобразует из одного часового пояса в другой
CURDATE(). Возвращает текущую дату
CURRENT_DATE(), CURRENT_DATE. Синонимы для CURDATE()
CURRENT_TIME(), CURRENT_TIME. Синонимы для CURTIME()
CURRENT_TIMESTAMP(), CURRENT_TIMESTAMP. Синонимы для NOW()
CURTIME(). Возвращает текущее время
DATE_ADD(). Слагает две даты
DATE_FORMAT(). Задает указанный формат даты
DATE_SUB(). Вычитает одну дату из другой
DATE(). Извлекает часть, относящуюся к дате, из выражения представляющего дату или время и дату
DATEDIFF(). Вычитает одну дату из другой
DAY(). Синоним для DAYOFMONTH()
DAYNAME(). Возвращает день недели
DAYOFMONTH(). Возвращает день месяца (1-31)
DAYOFWEEK(). Возвращает индекс дня недели аргумента
DAYOFYEAR(). Возвращает номер дня в году (1-366)
EXTRACT. Извлекает часть, относящуюся к дате
FROM_DAYS(). Преобразует номер дня в дату
FROM_UNIXTIME(). Форматирует дату как временную метку UNIX
HOUR(). Извлекает час
LAST_DAY. Возвращает последний день месяца для аргумента
LOCALTIME(), LOCALTIME. Синоним для NOW()
LOCALTIMESTAMP, LOCALTIMESTAMP (). Синоним для NOW()
MAKEDATE(). Создает дату из года и дня года
MAKETIME. MAKETIME(). MICROSECOND(). Возвращает микросекунды из аргумента
MINUTE(). Возвращает минуты из аргумента
MONTH(). Возврат месяца из даты
MONTHNAME(). Возвращает название месяца
NOW(). Возвращает текущую дату и время
PERIOD_ADD(). Добавляет период к году-месяцу
PERIOD_DIFF(). Возвращает количество месяцев между периодами
QUARTER(). Возвращает квартал из аргумента
SEC_TO_TIME(). Преобразует секунды в формат «HH: MM: SS»
SECOND(). Возвращает секунды (0-59)
STR_TO_DATE(). Преобразует строку в дату
SUBDATE(). При вызове с тремя аргументами синоним DATE_SUB()
SUBTIME(). Вычитает время
SYSDATE(). Возвращает время выполнения функции
TIME_FORMAT(). Задает формат времени
TIME_TO_SEC(). Возвращает аргумент, преобразованный в секунды
TIME(). Извлекает часть, относящуюся ко времени, из переданного выражения
TimeDiff(). Вычитает время
TIMESTAMP(). С одним аргументом эта функция возвращает выражение даты или даты и времени. С двумя аргументами — слагает эти два аргумента
TIMESTAMPADD(). Добавляет интервал к выражению даты и времени
TIMESTAMPDIFF(). Вычитает интервал из выражения даты и времени
TO_DAYS(). Возвращает аргумент даты, преобразованный в дни
UNIX_TIMESTAMP(). Возвращает временную метку UNIX
UTC_DATE(). Возвращает текущую дату UTC
UTC_TIME(). Возвращает текущее время UTC
UTC_TIMESTAMP(). Возвращает текущую дату и время UTC
WEEK(). Возвращает номер недели
WEEKDAY(). Возвращает индекс дня недели
WEEKOFYEAR(). Возвращает календарный номер недели (1-53)
YEAR(). Возвращает год
YEARWEEK(). Возвращает год и неделю
ADDDATE(date,INTERVAL expr unit), ADDDATE(expr,days)
При вызове со вторым аргументом, заданным в виде INTERVAL, функция ADDDATE() является синонимом DATE_ADD(). Связанная функция SUBDATE() является синонимом DATE_SUB(). Информацию об аргументе блока INTERVAL см. в разделе DATE_ADD().
При вызове со вторым аргументом, заданным в днях, MySQL рассматривает это как целое число дней для добавления в выражение.

ADDTIME(expr1,expr2)
ADDTIME () добавляет expr2 к expr1 и возвращает результат. Expr1 является выражением времени или даты и времени, в то время как expr2 является выражением времени.

CONVERT_TZ(dt,from_tz,to_tz)
Преобразует значение даты и времени dt из часового пояса, заданного в from_tz, в часовой пояс, заданный в to_tz, и возвращает полученное значение. Эта функция возвращает NULL, если аргументы недействительны.

CURDATE()
Возвращает текущую дату как значение в формате «YYYY-MM-DD» или YYYYMMDD, в зависимости от того, используется ли эта функция в строковом или в числовом контексте.

CURRENT_DATE и CURRENT_DATE()
CURRENT_DATE и CURRENT_DATE() являются синонимами для CURDATE()
CURTIME()
Возвращает текущее время как значение в формате «HH: MM: SS» или HHMMSS, в зависимости от того, используется ли функция в строковом или в числовом контексте. Значение выражается для текущего часового пояса.

CURRENT_TIME и CURRENT_TIME()
CURRENT_TIME и CURRENT_TIME() являются синонимами для CURTIME().
CURRENT_TIMESTAMP и CURRENT_TIMESTAMP()
CURRENT_TIMESTAMP и CURRENT_TIMESTAMP() являются синонимами для NOW().
DATE(expr)
Извлекает часть, относящуюся к дате, из выражения даты или даты и времени expr.

DATEDIFF(expr1,expr2)
DATEDIFF() возвращает expr1.expr2, выраженное как количество дней между двумя датами. И expr1, и expr2 являются выражениями даты или даты и времени. В расчетах используются только части относящиеся к дате.

DATE_ADD(date,INTERVAL expr unit), DATE_SUB(date,INTERVAL expr unit)
Эти функции выполняют арифметические операции с датами. date представлено как значение DATETIME или DATE, указывающее начальную дату. expr представляет собой выражение, определяющее значение интервала, который нужно добавить или вычесть из исходной даты. expr — это строка; она может начинаться с «-» для отрицательных интервалов.
unit является ключевым словом, указывающим единицы измерения для выражения. Ключевое слово INTERVAL и обозначение единиц не чувствительны к регистру. В следующей таблице показана ожидаемая форма аргумента expr для каждого значения единицы измерения.

Значения QUARTER и WEEK доступны в MySQL начиная с версии 5.0.0.

DATE_FORMAT (date,format)
Эта команда задает формат значения date в соответствии с указанной строкой format. В строке format могут использоваться следующие указатели. Перед указателями формата необходимо добавлять символ ‘%’.
%a. Сокращенное название дня недели (Sun..Sat)
%b. Сокращенное название месяца (Jan..Dec)
%с. Числовое обозначение месяца (0…12)
%D. День месяца с английским суффиксом (0, 1, 2, 3,.)
%d. Числовое обозначение дня месяца (00..31)
%е. Числовое обозначение дня месяца (00..31)
%f. Микросекунды (000000..999999)
%i. Числовое обозначение минут (00..59)
%J. День года (001..366)
%M. Название месяца (January..December)
%м. Числовое обозначение месяца (00..12)
%r. Время, 12-часовой формат (чч: мм: сс, за которым следуют AM или PM)
%Т. Время, 24-часовой формат (чч: мм: сс)
%U. Неделя (00..53), где воскресенье — первый день недели
%u. Неделя (00..53), где понедельник — первый день недели
%V. Неделя (01..53), где воскресенье — первый день недели; используется вместе с %X
%v. Неделя (01..53), где понедельник — первый день недели; используется вместе с %x
%W. Название дня недели (Sunday..Saturday)
%w. День недели (0=Sunday..6=Saturday)
%X. Год для недели, где первый день недели — воскресенье, число из четырех цифр; используется вместе с %V
%x. Год для недели, где первый день недели — понедельник, число из четырех цифр; используется вместе с %V
%Y. Год, число, четыре цифры
%y. Числовое обозначение года (две цифры)
%x. x, для всех .x., не перечисленных выше

DATE_SUB(date,INTERVAL expr unit)
Аналогично функции DATE_ADD ().
DAY(date)
DAY() является синонимом функции DAYOFMONTH().
DAYNAME(date)
Возвращает день недели для указанной даты.

DAYOFMONTH(date)
Возвращает день месяца для указанной даты в диапазоне от 0 до 31.

DAYOFWEEK(date)
Возвращает индекс дня недели (1 = Sunday, 2 = Monday, ., 7 = Saturday). Эти значения индекса соответствуют стандарту ODBC.

DAYOFYEAR(date)
Возвращает день года для указанной даты в диапазоне от 1 до 366.

EXTRACT(unit FROM date)
Функция EXTRACT() использует те же типы указателей единиц измерения, что и DATE_ADD() или DATE_SUB(), но не выполняет арифметические операции с датами, а извлекает из даты часть относящуюся к указателю единиц измерения.

FROM_DAYS(N)
Возвращается значение DATE с учетом числа дней N.

Примечание. Используйте FROM_DAYS() для старых дат осторожно. Функция не предназначена для работы со значениями дат до введения григорианского календаря (1582).
FROM_UNIXTIME(unix_timestamp), FROM_UNIXTIME(unix_timestamp,format)
Возвращает представление аргумента unix_timestamp как значение в формате «YYYY-MM-DD HH: MM: SS или YYYYMMDDHHMMSS» в зависимости от того, используется ли эта функция в строковом или в числовом контексте. Значение выражается в текущем часовом поясе. Параметр unix_timestamp является внутренним значением метки времени, которое создается функцией UNIX_TIMESTAMP().
Если format указано, результат форматируется в соответствии со строкой format, которая используется так же, как описано в разделе DATE_FORMAT().

HOUR(time)
Возвращает часы из указанного времени. Диапазон возвращаемого значения составляет от 0 до 23. Однако диапазон значений TIME на самом деле намного больше, поэтому HOUR может возвращать значения, превышающие 23.

LAST_DAY(date)
Принимает значение даты или даты и времени и возвращает значение, соответствующее последнему дню месяца. Возвращает NULL, если аргумент недействителен.

LOCALTIME и LOCALTIME()
LOCALTIME и LOCALTIME() являются синонимами для NOW().
LOCALTIMESTAMP и LOCALTIMESTAMP()
LOCALTIMESTAMP и LOCALTIMESTAMP() являются синонимами для NOW().
MAKEDATE(year,dayofyear)
Возвращает значения даты, заданного года и дня года. Значение dayofyear должно быть больше 0 или результат будет NULL.

MAKETIME(hour,minute,second)
Возвращает значение времени, рассчитанное из аргументов hour, minute и second.

MICROSECOND(expr)
Возвращает микросекунды из выражения времени или выражения datetime(expr) в виде числа в диапазоне от 0 до 999999.

MINUTE(time)
Возвращает минуты для указанного времени, в диапазоне от 0 до 59.

MONTH(date)
Возвращает месяц для указанной даты в диапазоне от 0 до 12.

MONTHNAME(date)
Возвращает полное название месяца для указанной даты.

NOW()
Возвращает текущую дату и время как значение в формате «YYYY-MM-DD HH: MM: SS» или YYYYMMDDHHMMSS, в зависимости от того, используется ли функция в строковом или числовом контексте. Это значение выражается в текущем часовом поясе.

PERIOD_ADD(P,N)
Добавляет N месяцев к периоду P (в формате YYMM или YYYYMM). Возвращает значение в формате YYYYMM. Обратите внимание, что аргумент периода P не является значением даты.

PERIOD_DIFF(P1,P2)
Возвращает количество месяцев между периодами P1 и P2. Периоды P1 и P2 должны указываться в формате YYMM или YYYYMM. Обратите внимание, что аргументы периодов P1 и P2 не являются значениями даты.

QUARTER(date)
Возвращает квартал года для указанной даты в диапазоне от 1 до 4.

SECOND(time)
Возвращает значение секунд для времени в диапазоне от 0 до 59.

SEC_TO_TIME(seconds)
Возвращает аргумент seconds, преобразованный в часы, минуты и секунды в формате «HH: MM: SS» или HHMMSS, в зависимости от того, используется ли функция в строковом или числовом контексте.

STR_TO_DATE(str,format)
Это инверсивная функция к функции DATE_FORMAT(). Она принимает строку str и строку формата format. Функция STR_TO_DATE() возвращает значение DATETIME, если строка формата содержит как дату, так и время. В противном случае она возвращает значение DATE или TIME, если строка содержит только дату или время.

SUBDATE(date,INTERVAL expr unit) и SUBDATE(expr,days)
Если SUBDATE() вызывается со вторым аргументом, заданным в виде INTERVAL, функция является синонимом DATE_SUB(). Информацию об аргументе INTERVAL смотрите в разделе DATE_ADD().

SUBTIME(expr1,expr2)
Функция SUBTIME() возвращает expr1. expr2 выражается как значение в том же формате, что и expr1. Значение expr1 является выражением времени или даты и времени, а значение expr2 является выражением времени.

SYSDATE()
Возвращает текущую дату и время как значение в формате «YYYY-MM-DD HH: MM: SS» или YYYYMMDDHHMMSS, в зависимости от того, используется ли функция в строковом или в числовом контексте.

TIME(expr)
Извлекает часть, относящуюся ко времени, выражения expr и возвращает его в виде строки.

TIMEDIFF(expr1,expr2)
Функция TIMEDIFF() возвращает expr1 . expr2 выражается как значение времени. Значения expr1 и expr2 представляют собой выражения времени или даты и времени, но оба они должны быть одного типа.

TIMESTAMP (expr), TIMESTAMP (expr1, expr2)
С одним указанным аргументом эта функция возвращает выражение даты или даты и времени expr, как значение даты и времени. С двумя аргументами она добавляет выражение времени expr2 к выражению даты или даты и времени expr1 и возвращает результат как значение даты и времени.

TIMESTAMPADD(unit,interval,datetime_expr)
Эта функция добавляет целочисленное выражение interval к выражению даты или времени datetime_expr. Единицы измерения для интервала задаются аргументом unit, который может принимать одно из следующих значений:
Значение unit может быть указано с использованием одного из ключевых слов, как было показано выше, или с префиксом SQL_TSI_. Например, DAY и SQL_TSI_DAY являются действительными значениями.

TIMESTAMPDIFF(unit,datetime_expr1,datetime_expr2)
Возвращает целочисленную разницу между выражениями даты или даты и времени datetime_expr1 и datetime_expr2. Единицы измерения для результата задаются аргументом unit. Действительными для аргумента unit являются те же значения, которые были перечислены в описании функции TIMESTAMPADD().

TIME_FORMAT(time,format)
Эта функция используется так же, как и функция DATE_FORMAT(), но строка format может содержать указатели формата только для часов, минут и секунд.
Если значение времени содержит часть, относящуюся к часам, которая больше 23, указатели формата часов %H и %k дают значение, большее, чем обычный диапазон от 0 до 23. Другие указатели формата часов дают значение часа 12 по модулю.

TIME_TO_SEC(time)
Возвращает аргумент time, преобразованный в секунды.

TO_DAYS(date)
Возвращает номер дня (количество дней с 0-го года) для заданной даты date.

UNIX_TIMESTAMP(), UNIX_TIMESTAMP(date)
Если эта функция вызывается без аргумента, она возвращает временную метку Unix (секунды с «1970-01-01 00:00:00» UTC), как целое положительное число. Если UNIX_TIMESTAMP() вызывается с аргументом date, она возвращает значение аргумента, выраженное в секундах с «1970-01-01 00:00:00» UTC. date может быть строкой DATE, строкой DATETIME, TIMESTAMP или числом в формате YYMMDD или YYYYMMDD.

UTC_DATE, UTC_DATE()
Возвращает текущую дату UTC как значение в формате «YYYY-MM-DD» или YYYYMMDD, в зависимости от того, используется ли эта функция в строковом или числовом контексте.

UTC_TIME, UTC_TIME()
Возвращает текущее время UTC как значение в формате «HH: MM: SS» или HHMMSS, в зависимости от того, используется ли функция в строковом или числовом контексте.

UTC_TIMESTAMP, UTC_TIMESTAMP()
Возвращает текущую дату и время UTC как значение «YYYY-MM-DD HH: MM: SS» или в формате YYYYMMDDHHMMSS, в зависимости от того, используется ли эта функция в строковом или в числовом контексте.

WEEK(date[,mode])
Эта функция возвращает номер недели для заданной даты date. Форма WEEK() с двумя аргументами позволяет указать, будет ли неделя начинаться в воскресенье или в понедельник, и должно ли возвращаемое значение находиться в диапазоне от 0 до 53 или от 1 до 53. Если аргумент mode опущен, используется значение системной переменной default_week_format


WEEKDAY(date)
Возвращает индекс дня недели для заданной даты date (0 = понедельник, 1 = вторник, 6 = воскресенье).

WEEKOFYEAR(date)
Возвращает календарную неделю для заданной даты date как число в диапазоне от 1 до 53. WEEKOFYEAR() — это функция совместимости, эквивалентная WEEK(date,3).

YEAR(date)
Возвращает год для заданной даты date в диапазоне от 1000 до 9999 или 0 для даты .zero.

YEARWEEK(date), YEARWEEK(date,mode)
Возвращает год и неделю для заданной даты date. Параметр mode работает точно так же, как аргумент mode для функции WEEK(). Год в результате может отличаться от года в аргументе даты для первой и последней недели года.

Примечание. Номер недели отличается от того, что вернет функция WEEK() (0) для необязательных аргументов 0 или 1, так как WEEK() вернет неделю в контексте данного года.
Редакция: Команда webformyself.
Особенности работы с 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 дата. При возникновении вопросов – обязательно задавайте их.
