GETDATE (Transact-SQL)
Возвращает текущую системную метку времени базы данных в виде значения datetime без смещения часового пояса базы данных. Это значение наследуется от операционной системы компьютера, на котором работает экземпляр SQL Server.
SYSDATETIME и SYSUTCDATETIME имеют большую точность в долях секунды, чем GETDATE и GETUTCDATE. SYSDATETIMEOFFSET включает смещение часового пояса, заданное в системе. SYSDATETIME, SYSUTCDATETIME и SYSDATETIMEOFFSET можно присваивать переменным любого типа даты и времени.
База данных SQL Azure (за исключением Управляемого экземпляра SQL Azure) и Azure Synapse Analytics используют время в формате UTC. Если необходимо интерпретировать сведения о дате и времени в часовом поясе, отличном от UTC, используйте AT TIME ZONE в Базе данных SQL Azure или Azure Synapse Analytics.
Обзор всех типов данных и функций даты и времени в языке Transact-SQL см. в статье Типы данных и функции даты и времени (Transact-SQL).
Синтаксис
GETDATE()
Тип возвращаемых данных
datetime
Remarks
Инструкции языка Transact-SQL могут ссылаться на функцию GETDATE в любом месте, где они могут ссылаться на выражение типа datetime.
GETDATE является недетерминированной функцией. Невозможно проиндексировать представления и выражения, ссылающиеся на эту функцию в столбце.
Использование SWITCHOFFSET с функцией GETDATE() может вызвать замедление выполнения запроса, поскольку оптимизатор запросов не может получить точные оценки количества элементов для значения GETDATE. Рекомендуется заранее вычислить значение GETDATE, а затем указать это значение в запросе, как показано в следующем примере. Кроме того, с помощью указания запроса OPTION (RECOMPILE) можно вынудить оптимизатор запросов повторно компилировать план запроса при каждом выполнении одного и того же запроса. В этом случае оптимизатор будет иметь точные оценки количества элементов для GETDATE(), что позволит ему сформировать более эффективный план запроса.
DECLARE @dt datetimeoffset = switchoffset (CONVERT(datetimeoffset, GETDATE()), '-04:00'); SELECT * FROM t WHERE c1 > @dt OPTION (RECOMPILE);
Примеры
В следующих примерах с помощью шести системных функций SQL Server, которые возвращают текущую дату и время, происходит возврат даты, времени или и того и другого. Значения возвращаются последовательно и поэтому могут различаться на доли секунды.
A. Получение текущей системной даты и времени
SELECT SYSDATETIME() ,SYSDATETIMEOFFSET() ,SYSUTCDATETIME() ,CURRENT_TIMESTAMP ,GETDATE() ,GETUTCDATE();
SYSDATETIME() 2007-04-30 13:10:02.0474381 SYSDATETIMEOFFSET()2007-04-30 13:10:02.0474381 -07:00 SYSUTCDATETIME() 2007-04-30 20:10:02.0474381 CURRENT_TIMESTAMP 2007-04-30 13:10:02.047 GETDATE() 2007-04-30 13:10:02.047 GETUTCDATE() 2007-04-30 20:10:02.047
Б. Получение текущей системной даты
SELECT CONVERT (date, SYSDATETIME()) ,CONVERT (date, SYSDATETIMEOFFSET()) ,CONVERT (date, SYSUTCDATETIME()) ,CONVERT (date, CURRENT_TIMESTAMP) ,CONVERT (date, GETDATE()) ,CONVERT (date, GETUTCDATE());
SYSDATETIME() 2007-05-03 SYSDATETIMEOFFSET() 2007-05-03 SYSUTCDATETIME() 2007-05-04 CURRENT_TIMESTAMP 2007-05-03 GETDATE() 2007-05-03 GETUTCDATE() 2007-05-04
В. Получение текущего системного времени
SELECT CONVERT (time, SYSDATETIME()) ,CONVERT (time, SYSDATETIMEOFFSET()) ,CONVERT (time, SYSUTCDATETIME()) ,CONVERT (time, CURRENT_TIMESTAMP) ,CONVERT (time, GETDATE()) ,CONVERT (time, GETUTCDATE());
SYSDATETIME() 13:18:45.3490361 SYSDATETIMEOFFSET() 13:18:45.3490361 SYSUTCDATETIME() 20:18:45.3490361 CURRENT_TIMESTAMP 13:18:45.3470000 GETDATE() 13:18:45.3470000 GETUTCDATE() 20:18:45.3470000
Примеры: Azure Synapse Analytics и Система платформы аналитики (PDW)
В приведенных ниже примерах с помощью трех системных функций SQL Server, которые возвращают текущую дату и время, происходит получение даты, времени или и того и другого. Значения возвращаются последовательно и поэтому могут различаться на доли секунды.
Г. Получение текущей системной даты и времени
SELECT SYSDATETIME() ,CURRENT_TIMESTAMP ,GETDATE();
Д. Получение текущей системной даты
SELECT CONVERT (date, SYSDATETIME()) ,CONVERT (date, CURRENT_TIMESTAMP) ,CONVERT (date, GETDATE());
Е. Получение текущего системного времени
SELECT CONVERT (time, SYSDATETIME()) ,CONVERT (time, CURRENT_TIMESTAMP) ,CONVERT (time, GETDATE());
Как вывести дату в sql
Чтобы вывести дату в SQL, используйте функцию DATE_FORMAT() . Синтаксис функции выглядит следующим образом:
DATE_FORMAT(date, format)
где date — это дата, которую вы хотите отформатировать, а format — это строка формата, которая определяет, как должна быть отформатирована дата.
Например, чтобы вывести текущую дату в формате ГГГГ-ММ-ДД, используйте следующий запрос:
SELECT DATE_FORMAT(NOW(), '%Y-%m-%d');
В результате выполнения этого запроса вы увидите дату в формате ГГГГ-ММ-ДД, например, 2023-04-08.
Вы также можете использовать функции для работы с датами, такие как NOW() , CURDATE() , CURTIME() , чтобы получить текущую дату и время, текущую дату и текущее время соответственно.
Некоторые примеры форматирования дат:
- ‘%Y-%m-%d’ — ГГГГ-ММ-ДД (например, 2023-04-08)
- ‘%Y-%m-%d %H:%i:%s’ — ГГГГ-ММ-ДД ЧЧ:ММ:СС (например, 2023-04-08 13:30:45)
- ‘%d-%m-%Y’ — ДД-ММ-ГГГГ (например, 08-04-2023)
Обратите внимание, что форматирование даты может отличаться в зависимости от используемой СУБД.
T-SQL 2012: Дата и время
—Разница между датами.Синтаксис: DATEDIFF(datepart,startdate, enddate)
DECLARE @df1 DATE = ‘20140210’;
DECLARE @df2 DATE = ‘20110415’;
SELECT DATEDIFF(DAY, @df1 , @df2) AS [days]
SELECT DATEDIFF(month, @df1 , @df2) AS [months]
SELECT DATEDIFF(year, @df1 , @df2) AS [years]
—Получить день\месяц\год из даты
SELECT DATEPART(DAY, @df1) AS [day]
SELECT DATEPART(MONTH, @df1) AS [months]
SELECT DATEPART(YEAR, @df1) AS [year]
—Получить название месяца
SELECT DATENAME(MONTH, @df1) AS [months]
—Получить часовой пояс. Значение хранится в минутах +04:00 = 240 минут
SELECT DATEPART(TZOFFSET, SYSDATETIMEOFFSET()) AS [+X]
—Добавить к дате год\месяц\день
SELECT DATEADD(MONTH,4,@df1) AS [+MONTH]
—Конвертирование ДатыВремя в Дату в Германском формате
SELECT CONVERT(DATE, GETDATE(), 104);
—Получить конечную дату месяца
SELECT EOMONTH(SYSDATETIME());
—Построение дат\времени из частей
SELECT DATEFROMPARTS(2014, 01, 01);
SELECT DATETIMEFROMPARTS(2014, 01, 01, 01, 01, 01, 01);
SELECT DATETIME2FROMPARTS(2014, 01, 01, 01, 01, 01, 01, 01);
SELECT TIMEFROMPARTS(01, 01, 01, 01, 01);
—Смещение
SELECT SWITCHOFFSET(SYSDATETIMEOFFSET(), ‘-05:00’);
SELECT SWITCHOFFSET(SYSDATETIMEOFFSET(), ‘-08:00’);
Примеры работы с датами в Oracle
Блин, что же может быть проще?
Почему я все время забываю эту команду.
select TO_DATE('16/10/2016', 'dd/mm/yyyy') from dual;
Вычисления текущего дня, месяца и т.д. с помощью SQL
Текущая неделя
-- Сегодня select trunc (SYSDATE) from dual;
-- Вчера select trunc (SYSDATE-1) from dual;
-- Завтра select trunc (SYSDATE+1) from dual;
-- Первый день недели select trunc(SYSDATE, 'DAY') from dual; -- Output: 30.05.2016
-- Последний день недели select trunc(SYSDATE, 'DAY')+6 from dual; -- Output: 05.06.2016
Прошедшая неделя
-- Первый день прошедшей недели select trunc(SYSDATE, 'DAY') -7 from dual; -- Output: 23.05.2016
-- Последний день прошедшей недели select trunc(SYSDATE, 'DAY')-1 from dual; -- Output: 29.05.2016
Следующая неделя
-- Первый день следующей недели select trunc(SYSDATE, 'DAY') +7 from dual; -- Output: 06.06.2016
-- Последний день следующей недели select trunc(SYSDATE, 'DAY') +13 from dual; -- Output: 12.06.2016
Текущий месяц
-- Первый день месяца select trunc (SYSDATE, 'MM') from dual;
-- Последний день месяца select trunc (last_day(sysdate)) from dual;
Прошедший месяц
-- Первый день прошлого месяца select trunc(ADD_MONTHS(SYSDATE, -1), 'MM') from dual;
-- Последний день прошлого месяца select trunc (SYSDATE, 'MM') -1 from dual;
Следующий месяц
-- Первый день следующего месяца select trunc (last_day(sysdate)) +1 from dual;
-- Последний день следующего месяца select trunc(LAST_DAY(ADD_MONTHS(SYSDATE, 1))) from dual;
Текущий квартал
-- Первый день квартала select trunc (SYSDATE, 'Q') from dual; -- Последний день квартала select add_months(trunc(sysdate,'q'),3)-1 from dual;
Прошлый квартал
-- Первый день прошлого квартала select trunc(add_months(sysdate,-3),'q') from dual; -- Последний день прошлого квартала select add_months(trunc(add_months(sysdate,-3),'q'),3)-1 from dual;
Следующий квартал
-- Первый день следующего квартала select add_months(trunc(sysdate,'q'),3) from dual; -- Последний день следующего квартала select add_months(trunc(add_months(sysdate,3),'q'),3)-1 from dual;
Текущий год
-- Первый день года select trunc (SYSDATE, 'Y') from dual; -- Последний день года select ADD_MONTHS(trunc (SYSDATE, 'YEAR'),12)-1 FROM DUAL;
Прошедший год
-- Первый день прошлого года select ADD_MONTHS (trunc (SYSDATE, 'YEAR'), -12) FROM DUAL; -- Последний день прошлого года select ADD_MONTHS (trunc (SYSDATE, 'YEAR'), -1 ) +30 FROM DUAL;
Следующий год
-- Первый день следующего года select ADD_MONTHS(trunc (SYSDATE, 'YEAR'),12) FROM DUAL; -- Последний день следующего года select ADD_MONTHS(trunc (SYSDATE, 'YEAR'),24)-1 FROM DUAL;
Нужно будет упростить вычисления, если это возможно.
Я писал на лету и сам эти вычисления не использую. Т.е. допускаю, что где-то закралась ошибка. Если что, поправлю.
Tags: Oracle, sql, вычисление дат
PL/SQL
tags: Администрирование Oracle DataBase || SQL & PL/SQL
Исходные коды проекта хранятся на github. Можете заводить Issue и Discussions, при необходимости.
Чтобы задать вопрос, добавить свои знания, исправить ошибки и неточности, пишите в телеграм чате.
