Date sql формат: FORMAT (Transact-SQL) — SQL Server

Содержание

PHP: DateTime::format — Manual

День
d День месяца, 2 цифры с ведущим нулём от 01 до 31
D Текстовое представление дня недели, 3 символа от Mon до Sun
j День месяца без ведущего нуля от 1 до 31
l (строчная ‘L’) Полное наименование дня недели от Sunday до Saturday
N Порядковый номер дня недели в соответствии со стандартом ISO-8601 от 1 (понедельник) до 7 (воскресенье)
S Английский суффикс порядкового числительного дня месяца, 2 символа st, nd, rd или
th
. Применяется совместно с j
w Порядковый номер дня недели от 0 (воскресенье) до 6 (суббота)
z Порядковый номер дня в году (начиная с 0) От 0 до 365
Неделя
W Порядковый номер недели года в соответствии со стандартом ISO-8601; недели начинаются с понедельника Например: 42 (42-я неделя года)
Месяц
F Полное наименование месяца, например, January или March
от January до December
m Порядковый номер месяца с ведущим нулём от 01 до 12
M Сокращённое наименование месяца, 3 символа от Jan до Dec
n Порядковый номер месяца без ведущего нуля от 1 до 12
t Количество дней в указанном месяце от 28 до 31
Год
L Признак високосного года 1, если год високосный, иначе 0
.
o Номер года в соответствии со стандартом ISO-8601. Имеет то же значение, что и Y, кроме случая, когда номер недели ISO (W) принадлежит предыдущему или следующему году; тогда будет использован год этой недели. Примеры: 1999 или 2003
Y Порядковый номер года, 4 цифры Примеры: 1999, 2003
y Номер года, 2 цифры Примеры: 99, 03
Время
a
Ante meridiem (лат. «до полудня») или Post meridiem (лат. «после полудня») в нижнем регистре
am или pm
A Ante meridiem или Post meridiem в верхнем регистре AM или PM
B Время в формате Интернет-времени (альтернативной системы отсчёта времени суток) от 000 до 999
g Часы в 12-часовом формате без ведущего нуля от 1 до 12
G Часы в 24-часовом формате без ведущего нуля от 0 до 23
h
Часы в 12-часовом формате с ведущим нулём от 01 до 12
H Часы в 24-часовом формате с ведущим нулём от 00 до 23
i Минуты с ведущим нулём от 00 до 59
s Секунды с ведущим нулём от 00 до 59
u Микросекунды. Учтите, что date() всегда будет возвращать 000000, т.к. она принимает целочисленный (int) параметр, тогда как DateTime::format() поддерживает микросекунды, если DateTime создан с ними. Например: 654321
v Миллисекунды (добавлено в PHP 7.0.0). Замечание такое же как и для u. Пример: 654
Временная зона
e Идентификатор временной зоны Примеры: UTC, GMT, Atlantic/Azores
I (заглавная i) Признак летнего времени 1, если дата соответствует летнему времени, 0 в противном случае.
O Разница с временем по Гринвичу без двоеточия между часами и минутами Например: +0200
P Разница с временем по Гринвичу с двоеточием между часами и минутами Например: +02:00
p То же, что и P, но возвращает Z вместо +00:00 Например: +02:00
T Аббревиатура временной зоны Примеры: EST, MDT
Z Смещение временной зоны в секундах. Для временных зон, расположенных западнее UTC возвращаются отрицательные числа, а расположенных восточнее UTC — положительные. от -43200 до 50400
Полная дата/время
c Дата в формате стандарта ISO 8601 2004-02-12T15:19:21+00:00
r Дата в формате » RFC 2822 Например: Thu, 21 Dec 2000 16:01:07 +0200
U Количество секунд, прошедших с начала Эпохи Unix (1 января 1970 00:00:00 GMT) Смотрите также time()

TO_DATE ФУНКЦИЯ — Oracle PL/SQL •MySQL •MariaDB •SQL Server •SQLite

В этом учебном пособии вы узнаете, как использовать Oracle/PLSQL функцию TO_DATE с синтаксисом и примерами.

Описание

Oracle/PLSQL функция TO_DATE преобразует строку в дату.

Синтаксис

Синтаксис функции Oracle/PLSQL TO_DATE:

TO_DATE( string1, [ format_mask ], [ nls_language ] )

Параметры или аргументы

string1 это строка, которая будет преобразована в дату.

format_mask не является обязательным. Это формат, который будет использоваться для преобразования string1 к дате.
Это может быть одно или сочетание следующих значений:

Параметр Пояснение
YYYY 4-х значный год
YYY
YY
Y
Последние 3, 2 или 1 цифры(а) года.
IYY
IY
I
Последние 3, 2 или 1 цифры(а) года ISO.
IYYY 4-значный год в соответствии со стандартом ISO
RRRR Принимает год с 2 цифрами и возвращает год с 4 цифрами.
Значение между 0-49 вернет 20xx год.
Значение между 50-99 вернет 19xx год.
Q Квартал года (1, 2, 3, 4; JAN-MAR = 1).
MM Месяц (01-12; JAN = 01).
MON Сокращенное название месяца.
MONTH Название месяца, дополненное пробелами длиной до 9 символов.
RM Римская цифра RM (I-XII; JAN = I).
WW Неделя года (1-53), где неделя 1 начинается в первый день года и продолжается до седьмого дня года.
W Неделя месяца (1-5), где 1-я неделя начинается в первый день месяца и заканчивается седьмым.
IW Неделя года (1-52 или 1-53) на основе стандарта ISO.
D День недели (1-7).
DAY Название дня.
DD День месяца (1-31).
DDD День года (1-366).
DY Сокращенное название дня.
J Юлианский день; количество дней с 1 января 4712 г. до н.э.
HH Час дня (1-12).
Hh22 Час дня (1-12).
Hh34 Час дня (0-23).
MI Минута (0-59).
SS Секунда (0-59).
SSSSS Секунды после полуночи (0-86399).
FF Дробные секунды. Используйте значение от 1 до 9 после FF, чтобы указать количество цифр в долях секунды. Например, ‘FF4’.
AM, A.M., PM, или P.M. Индикатор меридиана.
AD или A.D AD индикатор.
BC или B.C. BC индикатор.
TZD Летнее время информация. Например, ‘PST’
TZH
Часовой пояс час.
TZM Часовой пояс минуты.
TZR Часовой пояс региона.

nls_language не является обязательным. NLS language используется для преобразования string1 к дате.

Применение

Функцию TO_DATE можно использовать в следующих версиях Oracle/PLSQL:

  • Oracle 12c, Oracle 11g, Oracle 10g, Oracle 9i, Oracle 8i

Пример

Рассмотрим несколько примеров функции TO_DATE, чтобы понять, как использовать функцию TO_DATE в Oracle/PLSQL.

SELECT TO_DATE(‘2019/07/22’, ‘yyyy/mm/dd’) FROM DUAL; —Результат: 22.07.2019 SELECT TO_DATE(‘072219’, ‘MMDDYY’) FROM DUAL; —Результат: 22.07.2019 SELECT TO_DATE(‘20190722’, ‘yyyymmdd’) FROM DUAL; —Результат: 22.07.2019 SELECT TO_DATE(‘30.01.2019 18:30:52’, ‘DD.MM.YYYY Hh34:MI:SS’) FROM DUAL; —Результат: 30.01.2019 18:30:52

SELECT TO_DATE(‘2019/07/22’, ‘yyyy/mm/dd’) FROM DUAL;

 

—Результат:       22.07.2019

 

SELECT TO_DATE(‘072219’, ‘MMDDYY’) FROM DUAL;

 

—Результат:       22. 07.2019

 

SELECT TO_DATE(‘20190722’, ‘yyyymmdd’) FROM DUAL;

 

—Результат:       22.07.2019

 

SELECT TO_DATE(‘30.01.2019 18:30:52’, ‘DD.MM.YYYY Hh34:MI:SS’) FROM DUAL;

 

—Результат:       30.01.2019 18:30:52

ITband.ru » Окончательный справочник по типам данных datetime

Цель этой статьи заключается в разъяснении особенностей работы с типами DATETIME в SQL Server, в том числе часто встречающихся заблуждений и общих рекомендаций по их преодолению. Благодаря Frank Kalis эта статья переведена на немецкий язык.

Благодарности:

Я хочу поблагодарить следующих людей за их ценные предложения и материалы для этой статьи: Steve Kass, Aaron Bertrand, Jacco Schalkwijk, Klaus Oberdalhoff, Hugo Kornelis, Dan Guzman и Erland Sommarskog.

Версии SQL Server

Данная статья применима к SQL Server 7.0, 2000, 2005 и 2008, если не указано иначе.

Типы даты и времени в SQL Server

До SQL Server 2008 в SQL Server имелось два типа данных для обработки даты и времени. Поскольку в этой статье мы очень часто будем ссылаться на эти типы, введем сокращенную аббревиатуру для каждого типа в двух представленных ниже таблицах (колонка СК):

Название

СК

Мин. значение

Макс. значение

Точность

Используемая память

smalldatetime sdt 1900-01-01 00:00:00 2079-06-06 23:59:00 минута 4 байта
datetime dt 1753-01-01 00:00:00. 000 9999-12-31 23:59:59.997 3.33 мс 8 байт

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

Если задавать только ту часть что касается даты, то SQL Server сохранит время в виде 00:00:00.000.
А если устанавливать значение только времени, SQL Server будет хранить дату как 01.01.1900.
Это очень важно. Прочтите снова.

SELECT CAST(‘20041223’ AS datetime)

———————–
2004-12-23 00:00:00.000

SELECT CAST(’14:23:58′ AS datetime)

———————–
1900-01-01 14:23:58.000

С появлением SQL Server 2008 было получено несколько новых типов данных связанных со значениями даты и времени:

Название

СК

Мин. значение

Макс. значение

Точность

Используемая память

datetime2 dt2 0001-01-01 00:00:00.0000000 9999-12-31 23:59:59.9999999 100 нс 6-8 байт
date d 0001-01-01 9999-12-31 день 3 байта
time t 00:00:00. 0000000 23:59:59.9999999 100 нс 3-5 байта
datetimeoffset dto 0001-01-01 00:00:00.0000000 9999-12-31 23:59:59.9999999 100 нс 8-10 байт
  • Как вы можете видеть, мы наконец-то получили типы данных только для даты (date) и только для времени (time).
  • Datetime2 это “лучшее DATETIME” по ряду причин, и занимает не многим больше памяти, чем datetime и потенциально даже меньше!
  • Для нового типа включающего величину времени, вы можете задать “точность до дробных секунд” определяя используемый порядок цифр в секундах после запятой. Так, time(3) может хранить значения наподобие 14:23:12.567, которые при вводе значения 14:23:12:5677 округляются до 14:23:12:568.
  • Новый тип datetimeoffset содержит в себе часть смещения местного часового пояса.

Форматы даты и времени

Распространенное заблуждение – то, что SQL Server хранит эти типы данных в некотором специфическом удобном для чтения формате. Это не так. SQL Server хранит такие значения в своем внутреннем формате (например, два целых числа для datetime и smalldatetime). При этом, когда используется T-SQL для установки значения (например, в выражении INSERT) вы выражаете его как текстовую строку. Существуют также правила для интерпретации SQL Server-ом различных форматов даты-строки. Но заметим, что в любом случае SQL Server не запомнит этот формат.

Входные форматы для даты и времени

Есть много доступных форматов для приведения значений к виду date/time/datetime. Некоторые из них “лучше”, чем другие, и далее вы поймете почему “лучше”. Примечательно, что все эти форматы применимы для всех типов. Так даже формат “только время” применимо для типа “только дата” и т.д . (В статье игнорируется часть смещения местного часового пояса, которая используется только в типе данных datetimeoffset – более подробно о котором в Books Online.)

Название

СК

Формат

SET DATEFORMAT зависимость

SET LANGUAGE зависимость

Нейтральность к языку

Unseparated u ‘19980223 14:23:05’ нет нет для всех
Separated s ’02/23/1998 14:23:05′ для всех для всех нет
ANSI SQL ansisql ‘1998-12-23 14:23:05’ sdt, dt sdt, dt не для sdt и dt
Alphabetic a ’23 February 1998 14:23:05′ нет для всех (название месяца) нет
ODBC datetime odt {ts ‘1998-02-23 14:23:05’} нет нет для всех
ODBC date od {d ‘1998-02-23’} нет нет для всех
ODBC time ot {t ’14:23:05′} нет нет для всех
ISO 8601 iso ‘1998-02-23T14:23:05’ нет нет для всех
Time t ’14:23:05′
‘2:23:05 PM’
нет нет для всех
  • Отметим, ANSI SQL действительно только частный случай формата с разделительными символами Separated (так называемый “цифровой”), использующий в качестве разделителей тире (-), косую черту (/) и точку (. ). Но, поскольку это единственный формат, определенный в стандарте ANSI SQL, по мнению автора это стоит упомянуть как частный случай.
  • Большинство форматов позволяют удалять часть содержащую дату и/или время, и в некоторых случаях это может выглядеть немного … странно. Казалось бы, неразумно указывать, например ‘2008-08-25’ как тип время (time), но в конечном результате это аналогично не установке значений в строке datetime. Рассмотрим ниже:
    SELECT CAST(” AS time)
    SELECT CAST(‘2008-08-25’ AS time)

    Оба запроса выдают один и тот же результат (time 00:00:00).
  • ODBC форматы (ODBC datetime, ODBC date, ODBC time) отличаются в том смысле, что у них есть маркер (literal_type, t, d или ts), который необходимо правильно задать в зависимости от того, получать ли дату и время, только дату или только время.
  • Для применения формата ISO 8601 необходим сегмент даты и времени.
  • SET DATEFORMAT наследует свои настройки от SET LANGUAGE (но явно заданный SET DATEFORMAT аннулирует более поздний SET LANGUAGE). Языковые настройки по умолчанию задаются для каждого языка используемого при вводе логина. Язык по умолчанию для логина задается при помощи sp_configure.
  • Правила, относительно форматирования части даты и новых типов могут привести к путанице. Microsoft стремится, чтобы дата новых соответствующих типов данных (date, datetime2 и datetimeoffset) была менее зависима от настроек и еще более соответствовала требованиям ANSI SQL. И в результате – новые типы нейтрально-языковые для выделения составляющих даты-времени до тех пор пока год на первом месте. SQL Server-у необходимо определить, что эта часть является годом, и поэтому требуется 4 позиции составляющих год (yyyy, а не yy). Если это так, то строка будет интерпретироваться как сначала год, затем месяц и, наконец, день – независимо от DATEFORMAT или языковых установок. Если же вначале указывается месяц, тогда DATEFORMAT и языковые настройки будут “соблюдаться”:
    SET LANGUAGE British –uses dmy
    GO
    SELECT CAST(’02-23-1998 14:23:05′ AS date) –Error
    GO
    SELECT CAST(‘2/23/1998 14:23:05’ AS date) –Error
    GO
    SELECT CAST(‘1998-02-23 14:23:05’ AS date) –Ok
    GO
    SELECT CAST(‘1998. 02.23 14:23:05’ AS date) –Ok
    GO
    SELECT CAST(‘1998/02/23 14:23:05’ AS date) –Ok
    GO
    Первые два запроса ошибочны поскольку год не на первой позиции (и нет 23 месяца в 1998 году). В последующих трех запросах ошибок нет, поскольку требования учтены, и год указан первым (и мы используем один из новых стилей типов связанных с датой). Предельно прозрачно, правда? 🙂

Описание доступных форматов имеется в Books Online, поэтому вдаваться в подробности для каждого формата нет смысла.

Здесь приведена ссылка на Books Online, смотри подраздел для каждого формата. Отметим, что только формат ODBC time выдаст текущую дату, а не 1900-01-01 как в других форматах типа “только время”.

Некоторые выводы:

  • Формат Alphabetic использовать не рекомендуется, поскольку SET LANGUAGE влияет на все типы.
  • Не рекомендуется использовать типы smalldatetime и datetime поскольку они зависят не только от SET LANGUAGE, но и от SET DATEFORMAT (в том числе языковые параметры логирования).
  • Вы думаете, что не имеет значения, как комбинация формат/тип влияет (или нет) на SET LANGUAGE, “Я все равно никогда не буду выполнять команду SET LANGUAGE”. Но обратите внимание, предельно осторожно, что значения по умолчанию для DATEFORMAT подтягивается из спецификации логина (CREATE LOGIN т.д.). Представьте ситуацию, когда приложения разработанные в США с логином имеющим по-умолчанию язык(us_english), использующие m/d/y формат и datetime. К примеру, в Германии кто-то начнет использовать это приложение и бац! Приложение не работает. Удалось привлечь ваше внимание? 🙂
  • Типы представленные в SQL Server 2008 являются дружественными, поскольку они не зависят от SET DATEFORMAT, если у вас в Separated формате (с разделением) первым определен год. Для форматов с символами-разделителями (в том числе ANSI SQL), новые типы всегда интерпретируют месяц впереди даты.

Рекомендации для ввода

Как вы наверное понимаете, вы не хотите использовать сочетание формата и типа, не зависящих от языка, пока не убедитесь, что у вас есть правильный DATEFORMAT и языковые настройки в своих приложениях. Имейте в виду, что установка этих параметров в хранимых процедурах может привести к перекомпиляции процедуры во время ее выполнения!
Моя рекомендация заключается в использовании нейтрально-языкового формата. Я обычно использую формат без разделителей Unseparated, главным образом по старой привычке. Формат ISO 8601 имеет преимущество, поскольку определен в качестве международного стандарта.

SQL Server 2008 был выпущен в момент написания этой статьи, только я вернусь к date, time, datetime2 и возможно к datetimeoffset в следующий раз. В следующий раз, я мог бы использовать формат ANSI SQL (при совместимости ANSI SQL) с новыми типами, но автор предпочел бы, чтобы ANSI SQL поддерживал формат ISO 8601.

Безопасный путь это использовать или Unseparated, или ISO 8601 в течение ряда лет – даже если работаем с новыми типами данных.

Предупреждения и распространенные заблуждения

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

Числовой формат может использовать в качестве разделителя тире (-), точку (.) или косую черту (/).
Правила обработки SQL Server-ом строки, не меняются в зависимости от разделителя. Распространенное заблуждение то, что формат ANSI SQL (одно время неправильно называемый “ISO форматом”), 1998-02-23, нейтрально-языковой для smalldatetime и datetime. Это не так. Это цифровой формат и, следовательно, он зависит от установок SET DATEFORMAT и SET LANGUAGE:

SET LANGUAGE us_english
SELECT CAST(‘2003-02-28’ AS datetime)

———————–
2003-02-28 00:00:00. 000

SET LANGUAGE british
SELECT CAST(‘2003-02-28’ AS datetime)

Server: Msg 242, Level 16, State 3, Line 4
The conversion of a char data type to a datetime data type resulted in an out-of-range datetime value.

Пожалуйста, прочитайте внимательно сообщение об ошибке. Оно говорит о том, в чем конкретно проблема. Вы определяете значение datetime как строку, и потому что строка не сформирована согласно формату (который Вы используете) и настроек DATEFORMAT, SQL Server не может преобразовать строку в значение datetime.

Вывод значений DATETIME

Когда значение datetime выводится SQL Server-ом оно имеет нечитабельный вид. Клиентское приложение форматирует значение так, чтобы оно являлось удобочитаемым для человека. Некоторые среды приложений/разработки будут учитывать региональные настройки на клиентском компьютере и форматировать значения соответственно им. Но это не контролируется SQL Server-ом. Вы можете вернуть данные из SQL Server с помощью специального формата, но для этого необходимо преобразовать значение в строку, и в итоге результат этого преобразования не будет больше типом datetime. Если вы хотите это, используйте функцию CONVERT, у которой есть 3 параметра, которые определяют формат данных при конвертировании из DATETIME в строку. Вот несколько примеров:


SELECT CONVERT(char(8), CURRENT_TIMESTAMP, 112)——–
20040312SELECT CONVERT(char(19), CURRENT_TIMESTAMP, 120)——————-
2004-03-12 18:08:43 SELECT CONVERT(char(10), CURRENT_TIMESTAMP, 103)———-
12/03/2004

Поиск для значений DATETIME

Проблема с datetime-поиском часто состоит в том факте, что если вы используете smalldatetime, datetime, datetime2 или datetimeoffset, которые состоят из таких двух частей как дата и время. Создадим таблицу, которую мы будем использовать в нескольких примерах:

CREATE TABLE #dts(c1 char(1), dt datetime)
INSERT INTO #dts (c1, dt) VALUES(‘a’, ‘20040305 09:12:59’)
INSERT INTO #dts (c1, dt) VALUES(‘b’, ‘20040305 16:03:12’)
INSERT INTO #dts (c1, dt) VALUES(‘c’, ‘20040306 00:00:00’)
INSERT INTO #dts (c1, dt) VALUES(‘d’, ‘20040306 02:41:32’)
INSERT INTO #dts (c1, dt) VALUES(‘e’, ‘20040315 11:45:17’)
INSERT INTO #dts (c1, dt) VALUES(‘f’, ‘20040412 09:12:59’)
INSERT INTO #dts (c1, dt) VALUES(‘g’, ‘20040523 11:43:25’)

Скажем так, мы желаем найти все строки с 2004-03-15. Распространенная ошибка при поиске выглядит так:

SELECT c1, dt FROM #dts WHERE dt = ‘20040305’

Нет результатов. Почему? Что случилось? У нас есть два различных типа в предложении WHERE, тип datetime (колонка dt) и строка (справа). SQL Server преобразует один к другому в соответствии с документацией “Приоритетность типов данных” в Books Online. Datetime имеет высокий приоритет, чем строка, так что строка будет первой преобразована в тип datetime. Поскольку мы не указываем часть со временем, строка будет преобразована к значению datetime 2004-03-05 00:00:00. А с таким значением нет ни одной записи.

Хорошо, следующая попытка. Мы используем функцию CONVERT для табличной колонки dt, и конвертируем ее в строку, чтобы она соответствовала формату строки указанной в правой части:
SELECT c1, dt FROM #dts WHERE CONVERT(char(8), dt, 112) = ‘20040305’

Этот запрос вернул ожидаемые строки, но есть одна проблема. Поскольку происходит вычисление колонки dt (с помощью функции CONVERT), SQL Server не может использовать индекс для поддержки этого поиска. Это может иметь катастрофические последствия по производительности! Давайте попробуем BETWEEN:
SELECT c1, dt FROM #dts WHERE dt BETWEEN ‘20040305’ AND ‘20040306’

Потому что запрос содержит BETWEEN, вернулись записи по 2004-03-06 00:00:00. Давайте попробуем следующее:
SELECT c1, dt FROM #dts WHERE dt BETWEEN ‘20040305’ AND ‘20040305 23:59:59.999’

Что? У нас по-прежнему есть запись по 2004-03-06 00:00:00. Почему? Мы должны посмотреть на определения типов снова. Точность для datetime-типа 3,33 мс. Это значит что 2004-03-05 23:59:59.999 будет округлена до 2004-03-06 00:00:00.000. Не то, что ожидалось. Для того чтобы обойти эту проблему округления, попробуем следующее:

SELECT c1, dt FROM #dts WHERE dt BETWEEN ‘20040305’ AND ‘20040305 23:59:59.997’

Ожидаемые выше строки возвращаются, но я бы не стал называть этот подход интуитивно и легко-читаемым. Кроме того, если тип в таблице smalldatetime вместо datetime, часть содержащая время будет снова округлена, следовательно, ожидаемые строки не вернутся. Таким образом, у вас есть два варианта, в зависимости от того, что в настоящее время используются datetime или smalldatetime. Если это тип smalldatetime, используйте:

SELECT c1, dt FROM #dts WHERE dt BETWEEN ‘20040305’ AND ‘20040305 23:59:00’

Наличие двух различных решений в зависимости от используемых типов данных это не то что можно приветствовать. И, кто знает, что произойдет, если Microsoft в будущем добавит типы данных с высокой точностью для сегмента времени (что они и сделали в SQL Server 2008)? Снова вам придется корректировать долю времени в WHERE. Ниже рекомендации автора:

SELECT c1, dt FROM #dts WHERE dt >= ‘20040305’ AND dt < ‘20040306’

Мы получаем ожидаемые строки назад и легко понимаем за счет каких критериев. И SQL Server может использовать индекс для колонки dt. Для больших диапазонов этот поиск легко расширить. Скажем так, необходимо отобрать все строки для марта 2004 года:


SELECT c1, dt FROM #dts WHERE dt >= ‘20040301’ AND dt < ‘20040401’

Аналогично. Вот еще один способ для поиска всех строк за конкретный месяц:
SELECT c1, dt FROM #dts WHERE DATEPART(year, dt) = 2004 AND DATENAME(month, dt) = ‘March’

Выше возвращается ожидаемый результат, но остаются две проблемы. Поскольку в колонке с datetime есть расчеты, SQL Server в запросе не может использовать индекс для колонки dt. И, функция DATENAME зависит от установок SET LANGUAGE.

Избавляемся от временной части

Очень часто вам необходимо работать только с датой, и вам необходимо избавиться от временной части. Как вы знаете, сейчас это невозможно, если вы используете тип smalldatetime, datetime, datetime2 или datetimeoffset. Если вы используете тип date, тогда нет проблем – это та же дата, в конце концов! Но если вы настаиваете по какой-то причине использовать тип smalldatetime, datetime, datetime2 или datetimeoffset то, возможно, будет достаточно установки времени в 00:00:00? Вот мое предложение для выражения, возвращающего строку, которая может быть (неявно) преобразована в значение datetime, независимо от SET LANGUAGE или DATEFORMAT:

CONVERT(char(8), CURRENT_TIMESTAMP, 112)

Как видите, я использую CONVERT с конверсионным кодом 112, возвращающее дату в виде строки в формате Unseparated. А вы уже знаете, что формат Unseparated при конвертировании к datetime интерпретируется вне зависимости от даты или языковых настроек. Давайте вышеприведенное выражение добавим в CAST для преобразования значения к типу datetime:


SELECT CAST(CONVERT(char(8), CURRENT_TIMESTAMP, 112) AS datetime)

В случае, если вы действительно хотите только вернуть в клиентское приложение дату, а не время, тогда вместо этого вам необходимо возвращать строку(или, как в SQL Server 2008, тип date). Еще раз прочтите о различных кодах преобразования для функции CONVERT и вы, вероятно, подберете необходимый Вам формат.

На эту тему Hugo Kornelis оставил свой отзыв, в котором предлагает иной метод для установки сегмента отвечающий за время в 00:00:00. Эта идея основана на базовой дате (любая дата находится в пределах диапазона datetime SQL Server-а), временной сегмент которой определен как 00:00:00.

Сначала берем разницу в днях между сегодняшним днем и этой базовой датой. Затем добавляем это количество дней к базовой дате. Алгоритм: [сегодня] – [базовая дата] + [базовая дата], или в T-SQL (с использованием в качестве базовой даты 20040101):
SELECT DATEADD(day, DATEDIFF(day, ‘20040101’, CURRENT_TIMESTAMP), ‘20040101’)

Одним из аргументов в пользу использования этого метода является более высокая скорость выполнения по сравнению со строковыми преобразованиями. Ранее автор считал что отличия настолько малы (несколько микросекунд в соответствии с тестами сделанными в 2000 году), так что они даже не измеримы. Однако Dan Guzman сообщил по электронной почте удивительную для меня информацию. Вот цитата из письма:

“Я обнаружил, что использование метода DATEADD значительно превосходит метод со строкой, когда выражение применяется к столбцу в больших запросах. Например, я часто использую метод DATEADD для группировок по дате, когда колонка datetime включает в себя компоненту время. Недавно я тестировал производительность, но я повторно вспоминаю, что в некоторых случаях это были минуты”.
Дэну я очень доверяю, и поэтому я думаю, что мне есть чему заново научиться (вначале используя метод DATEADD вместо метода со строкой). Дэн приводит скрипт демонстрирующий это.

Вот здесь (с некоторыми незначительными изменениями форматирования сделанными мною). Мои тесты показывают достоверные результаты на SQL Server 2005 и 2008, где для 10,000,000 строк метод DATEADD отрабатывает около 6 секунд, а строчный метод отрабатывал около 13 секунд. Дэн сообщает об еще большей разнице на SQL Server 2000.

2009-04-03, получено письмо от Håkan Borneland. Он отметил, что это обычное явление, для примера в форумах MSDN, используя первый из нижеприведенных вариантов, вместо второй альтернативы (которой автор изначально располагал в своем сценарии тестирования производительности):

SELECT DATEADD(DAY, 0, DATEDIFF(DAY, 0, CURRENT_TIMESTAMP))
SELECT DATEADD(DAY, 0, DATEDIFF(DAY, ”, CURRENT_TIMESTAMP))

Обратите внимание, что они оба отличаются в версии DATEDIFF, которую мы обсудили несколько выше. Так что теперь у нас есть 4 различных метода достижения этой цели. “Мой” оригинальный метод преобразования строк и три DATEDIFF альтернативы:
SELECT CAST(CONVERT(CHAR(8), CURRENT_TIMESTAMP, 112) AS datetime) –1
SELECT DATEADD(DAY, 0, DATEDIFF(DAY, ”, CURRENT_TIMESTAMP)) –2
SELECT DATEADD(DAY, DATEDIFF(DAY, ‘20040101’, CURRENT_TIMESTAMP), ‘20040101’) –3
SELECT DATEADD(DAY, 0, DATEDIFF(DAY, 0, CURRENT_TIMESTAMP)) –4

Если вы чувствуете, что ваши операции по производительности могут быть главным беспокойством, то я предлагаю вам тест. Здесь тестовый скрипт с обновленной производительностью, для всех четырех версий. Вариант 1 медленный, а 3 DATEDIFF альтернативы (2-4) довольно близки к победной 4 альтернативе. Я также предлагаю вам рассмотреть удобочитаемость, которая является делом вкуса.

Альтернативные DATEADD также обладают преимуществом гибкости. Вместо того, чтобы перепечатать предложения Hugo, я просто скопировал исходный текст Hugo в присланное мне письмо:

Версия, которая использует строковое преобразование, может быть использована для отделения времени от текущей даты. DATEADD/DATEDIFF версия может быть легко изменена, для получения начала текущего месяца, квартала или года. SELECT DATEADD(month, DATEDIFF(month, ‘20000101’, CURRENT_TIMESTAMP), ‘20000101’) или к отказу только от минут и секунд, или только секунд SELECT DATEADD(hour, DATEDIFF(hour, ‘20000101’, CURRENT_TIMESTAMP), ‘20000101’) (Примечание – когда речь идет о минутах, секундах или миллисекундах, функция DATEDIFF может вызвать переполнение целочисленного диапазона – базовая дата могла бы быть адаптирована к ожидаемому набору значений datetime). Также возможны дальнейшие изменения: Как получить последний день предыдущего месяца в последний день текущего месяца?

SELECT DATEADD(month, DATEDIFF(month, ‘20000101’, CURRENT_TIMESTAMP), ‘19991231’)
SELECT DATEADD(month, DATEDIFF(month, ‘20000101’, CURRENT_TIMESTAMP), ‘20000131’)

Как получить завтрашнюю дату (без времени)?

SELECT DATEADD(day, DATEDIFF(day, ‘20000101’, CURRENT_TIMESTAMP), ‘20000102’)

Как округлить datetime до ближайшего часа, или к ближайшему дню?

SELECT DATEADD(hour, DATEDIFF(hour, ‘20000101’, DATEADD(minute, 30, CURRENT_TIMESTAMP)), ‘20000101’)
SELECT DATEADD(day, DATEDIFF(day, ‘20000101’, DATEADD(hour, 12, CURRENT_TIMESTAMP)), ‘20000101’)

Как получить дату последней пятницы, не используя таблицы календаря и независимо от текущих установок DATEFIRST?

SELECT DATEADD(day, (DATEDIFF (day, ‘20000107’, CURRENT_TIMESTAMP) / 7) * 7, ‘20000107’)

или
SELECT DATEADD(day, (DATEDIFF (day, ‘20000108’, CURRENT_TIMESTAMP) / 7) * 7, ‘20000107’)

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

Совет: Всегда установить время в одно и то же значение

Если вы не заинтересованы в сегменте времени, и вы не можете использовать тип дата (date), вы можете установить временную часть в стандартное значение для всех строк. Я рекомендую 00:00:00.000. Допустим, вы хотите установить значение текущей даты, когда выполняется INSERT. Для этого используем конструкцию DEFAULT:

CREATE TABLE #dts(id INT IDENTITY, d_date DATETIME DEFAULT CONVERT(char(8), CURRENT_TIMESTAMP, 112))
INSERT #dts DEFAULT VALUES
SELECT * FROM #dts

Я использую код 112 в вышеприведенной функции CONVERT(), которая возвращает строку с указанием только даты в формате «без разделительных знаков» (Unseparated). Тем не менее, мы не защищены от явной установки значения и присвоения сегменту времени чего-то отличного от 00:00:00:000.

Мы можем сделать это с помощью CONSTRAINT-а:

ALTER TABLE #dts ADD CONSTRAINT dts_chk_d_date CHECK(CONVERT(char(12), d_date, 114) = ’00:00:00:000′)

Какие преимущества нам дает это выражение? Если мы желаем найти все строки, начиная с определенной даты, WHERE напишем таким образом:

WHERE dt = ‘20040305’

Этот метод можно рассматривать как более понятный и удобный для чтения. Кроме этого, если вы захотите объединить 2 таблицы, основываясь только на дне, теперь это можно сделать напрямую. Если у вас величина времени (часть содержащая время) изменяется, то придется использовать CONVERT в операциях JOIN, которые снова могут катастрофически влиять на производительность.
Вышеизложенная технология применима, если вам интересна только величина времени, в таком случае я рекомендую Вам всегда устанавливать саму дату как 1900-01-01.
Теперь, в SQL Server 2008 это не более чем отдельные типы date и time?

Дополнительные советы от Steve Kass

С осторожностью указывайте все даты в запросах типом smalldatetime, используя CAST или CONVERT. Отметим, что в колонке datetime SQL Server 7.0 (не менее) это может привести к непредвиденному результату.

Везде без веских причин и пояснений, даты сохраняются только типом datetime или smalldatetime, а не в виде строки. Если даты должны быть сохранены в строковом виде (существует несколько хороших причин для этого, но их мало), то используйте нейтрально-языковой формат и 24-часовое представление если также сохраняете и время, так чтобы строки могли использоваться везде и также при сортировке дат. Например, можно использовать “dt < ‘20030101’” в предложении WHERE и запрос не возвращает ожидаемые строки, потому как dt хранится в виде строки в формате yyyy-mm-dd (гггг-мм-дд).
В Enterprise Manager (и некоторых других инструментах и приложениях Microsoft) базовая дата это 1899-12-30. EM никогда не должен использоваться для записи данных, и редко для просмотра данных. Если вы используете EM для указания данных «только время», EM сохранит дату как 1899-12-30. Если вы действительно хотите использовать EM, укажите дату 1900-01-01 в явном виде. Отметим также, что EM отобразит только величину времени, если дата 1899-12-30, а не то, что вы ожидаете, если у вас в качестве стандартного значения даты используется 1900-01-01.

Почему 1753 ближайшая дата для DATETIME?

Хороший вопрос. Ответ: именно по историческим причинам. В современное время у нас (в том, что мы иногда называем западным миром) было два календаря: Юлианский и Григорианский календарь. Эти календари по нумерации дней отличались друг от друга (в зависимости от столетия на который вы посмотрите), поэтому, когда используемый Юлианский календарь заменили на Григорианский, было удалено от 10 до 13 дней. Великобритания сделала этот переход в 1752 году (дата 1752-09-02 стала 1752-09-14). Научное предположение, зачем Sybase выбрали 1753 в качестве ближайшей даты состоит в том, что при сохранении более ранней даты чем 1753, необходимо учитывать что это за страна, а также обработать этот 10-13дневный «прыжок». Поэтому они[Sybase] решили не позволять даты ранее 1753 года. Однако отметим, что прочие страны сделали это смещение позже 1752. Турция, например, это реализовала аж в 1927 году.
Будучи шведом, автор находит забавной ситуацию самой фантастической реализация именно у Швеции. Было решено пропускать день сдвига в течение 40 лет (с 1700 до 1740), и Швеция была бы в синхронизации с Григорианским календарем после 1740 (но в течение этого времени, не в синхронизации с другими странами). Но по некоторым причинам, в 1704 и 1708 годах день сдвига был не пропущен, а в 1712 который был високосным годом, они вставили дополнительный день (представьте себе рожденных 30 февраля!), и затем в 1753 году сделали сдвиг в течение дня, как и все остальные.

Список рекомендованной литературы

Это, безусловно, самая сложная из найденных документация о календарях:

Часто задаваемые вопросы о календарях, Claus Tøndering

Книга Richard T. Snodgrass “Разработка временно-ориентированных приложений баз данных в SQL”: содержит много сведений о представлении время-ориентированной информации в модели данных. И, конечно же, возможно использование этой дополнительной (исторической) информации в своих запросах SQL. Эта книга не издается, а на официальном сайте Ричарда (www.cs.arizona.edu/people/rts), вы бесплатно можете скачать ее в PDF формате.

Оригинал: The ultimate guide to the datetime datatypes

Перевод: Винчик Евгений

sql-docs.ru-ru/set-dateformat-transact-sql.md at live · MicrosoftDocs/sql-docs.ru-ru · GitHub

description title ms.custom ms.date ms.prod ms.prod_service ms.reviewer ms.technology ms.topic f1_keywords dev_langs helpviewer_keywords ms.assetid author ms.author monikerRange ms.openlocfilehash ms.sourcegitcommit ms.translationtype ms.contentlocale ms.lasthandoff ms.locfileid

SET DATEFORMAT (Transact-SQL)

SET DATEFORMAT (Transact-SQL) | Документы Майкрософт

03/14/2017

sql

database-engine, sql-database, synapse-analytics, pdw

t-sql

reference

DATEFORMAT

SET DATEFORMAT

SET_DATEFORMAT_TSQL

DATEFORMAT_TSQL

dates [SQL Server], formats

dates [SQL Server], ordering date parts

SET DATEFORMAT option [SQL Server]

DATEFORMAT option [SQL Server]

date and time [SQL Server], SET DATEFORMAT

options [SQL Server], date

date and time [SQL Server], DATEFORMAT

dateparts [SQL Server], dateformat

da217878-7ec4-477e-aa13-604073c948f8

WilliamDAssafMSFT

wiassaf

>=aps-pdw-2016||=azuresqldb-current||=azure-sqldw-latest||>=sql-server-2016||>=sql-server-linux-2017||=azuresqldb-mi-current

a3ec299dd8d8daee6ab9711c86bc2d4f54b7f11e

0310fdb22916df013eef86fee44e660dbf39ad21

HT

ru-RU

03/20/2021

104751484

[!INCLUDE sql-asdb-asdbmi-asa-pdw]

Задает порядок элементов даты (месяц, день, год) при интерпретации символьных строк дат. Эти строки имеют тип date, smalldatetime, datetime, datetime2 или datetimeoffset.

Обзор всех типов данных и функций даты и времени в языке [!INCLUDEtsql] см. в статье Типы данных и функции даты и времени (Transact-SQL).

Синтаксические обозначения в Transact-SQL

Синтаксис

SET DATEFORMAT { format | @format_var }   

[!INCLUDEsql-server-tsql-previous-offline-documentation]

Аргументы

format | @ format_var
Порядок следования составляющих частей даты. Допустимые параметры: mdy, dmy, ymd, ydm, myd и dym. Может быть задано в формате Юникод или в виде двухбайтовой кодировки (DBCS), преобразованной в Юникод. Для языкового стандарта «Английский (США)» значение по умолчанию равно mdy. Значения параметра DATEFORMAT по умолчанию для всех поддерживаемых языков см. в разделе sp_helplanguage (Transact-SQL).

Комментарии

Значение ydm параметра DATEFORMAT не поддерживается для типов данных date, datetime2 и datetimeoffset.

Параметр DATEFORMAT может интерпретировать символьные строки по-разному для разных типов данных даты в зависимости от их формата строк. Например, интерпретации datetime и smalldatetime могут не соответствовать date, datetime2 или datetimeoffset. Этот параметр влияет на интерпретацию символьных строк при их преобразовании в значения даты для базы данных. Он не влияет на отображение значений типов данных даты, хранящихся в базе данных, а также на формат их хранения.

Некоторые форматы символьных строк, например ISO 8601, интерпретируются независимо от параметра DATEFORMAT.

Установка SET DATEFORMAT происходит во время выполнения, а не во время синтаксического анализа.

SET DATEFORMAT имеет преимущество над неявной установкой формата даты SET LANGUAGE.

Разрешения

Необходимо быть членом роли public.

Примеры

В следующем примере в качестве входных параметров сеансов используются различные строковые значения дат с одинаковым значением параметра DATEFORMAT.

-- Set date format to day/month/year.  
SET DATEFORMAT dmy;  
GO  
DECLARE @datevar DATETIME2 = '31/12/2008 09:01:01.1234567';  
SELECT @datevar;  
GO  
-- Result: 2008-12-31 09:01:01.123  
SET DATEFORMAT dmy;  
GO  
DECLARE @datevar DATETIME2 = '12/31/2008 09:01:01.1234567';  
SELECT @datevar;  
GO  
-- Result: Msg 241: Conversion failed when converting date and/or time -- from character string.  
  
GO  

См. также

Инструкции SET (Transact-SQL)

MSSQL — CONVERT Datetime to String

CONVERT(VARCHAR, GETDATE(), 121)

В следующей таблице два столбца слева представляют значения аргумента style для преобразования данных типа datetime или smalldatetime в символьные данные. Чтобы получить четырехзначное значение года, включающее столетие (гггг), добавьте 100 к значению аргумента style.

Без столетия (гг) Со столетием (гггг) Стандартный Ввод-вывод**

0 или 100 (*)

По умолчанию

мес дд гггг чч:ми AM (или PM)

1

101

США

мм/дд/гггг

2

102

ANSI

гг. мм.дд

3

103

Британский/французский

дд/мм/гг

4

104

Немецкий

дд.мм.гг

5

105

Итальянский

дд-мм-гг

6

106

дд мес гг

7

107

Мес дд, гг

8

108

чч:мм:сс

9 или 109 (*)

По умолчанию + миллисекунды

мес дд гггг чч:ми:сс:мсек AM (или PM)

10

110

США

мм-дд-гг

11

111

Японский

гг/мм/дд

12

112

ISO

Ггммдд

13 или 113 (*)

Европейский по умолчанию + миллисекунды

дд мес гггг чч:мм:сс:мсек (24-часовой формат)

14

114

чч:ми:сс:мсек (24-часовой формат)

20 или 120 (*)

Канонический формат ODBC

гггг-мм-дд чч:ми:сс (24-часовой формат)

21 или 121 (*)

Канонический формат ODBC (с миллисекундами)

гггг-мм-дд чч:ми:сс. мсек (24-часовой формат)

126(***)

ISO8601

гггг-мм-ддTчч:мм:сс.мсек (без пробелов)

130*

Хиджра****

дд мес гггг чч:мм:сс:мсек AM

131*

Хиджра****

дд/мм/гг чч:ми:сс:мсек AM

 

* Значения по умолчанию (style 0 или 100, 9 или 109, 13 или 113, 20 или 120 и 21 или 121) всегда возвращают столетие (гггг).

** Ввод при преобразовании в формат datetime. Вывод при преобразовании в символьные данные.

*** Для использования в XML. Для преобразования из типа данных datetime или smalldatetime в данные character формат вывода будет таким, как описано в таблице. При преобразовании из типа данных float, money или smallmoney в данные character формат вывода будет эквивалентен значению аргумента style 2. При преобразовании из типа данных real в данные character формат вывода будет эквивалентен значению аргумента style 1.

**** Хиджра — календарная система с несколькими вариантами, из которых в SQL Server Compact 3.5 использует кувейтский алгоритм.

Как изменить формат даты с MM / DD / YYYY на YYYY-MM-DD в PL / SQL? Безопасный SQL

У меня есть столбец даты в таблице, хранящейся в формате MM/DD/YYYY . Я должен выбрать и сохранить ту же дату в другой таблице в YYYY-MM-DD , то есть формате даты XSD. Но я не в состоянии это сделать. Я использую этот запрос:

Но все же я не могу этого сделать. Даю мне ошибку

использование

 select to_char(date_column,'YYYY-MM-DD') from table; 

Похоже, вы ошибаетесь. Если ваши существующие данные находятся в формате MM / DD / YYYY, вы хотите:

 select to_date(date_column,'MM/DD/YYYY') from table; 

для преобразования существующих данных в значения DATE. (Я действительно удивляюсь, почему они не хранятся как даты, если честно …)

Если вы хотите выполнить преобразование за один шаг, вам может потребоваться:

 select to_char(to_date(date_column,'MM/DD/YYYY'), 'YYYY-MM-DD') from table; 

Другими словами, для каждой строки проанализируйте ее в формате MM / DD / YYYY, затем переформатируйте ее в формате ГГГГ-ММ-ДД.

(Я все же предлагаю попытаться сохранить данные в своем «естественном» типе, но вместо того, чтобы хранить его как текст в первую очередь.)

Я предполагаю, что вы можете использовать Oracle SQL Developer, который вы можете скачать здесь .

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

 ALTER SESSION SET nls_date_format='yyyy-mm-dd'; 

Теперь вы можете выполнить такой запрос:

 SELECT * FROM emp_company WHERE JDate = '2014-02-25' 

Если вы хотите быть более конкретным, вы можете определить формат даты следующим образом:

 ALTER SESSION SET nls_date_format='yyyy-mm-dd hh34:mi:ss'; 

Чтобы преобразовать столбец DATE в другой формат, просто используйте TO_CHAR() с нужным форматом, а затем преобразуйте его обратно в тип DATE :

 SELECT TO_DATE(TO_CHAR(date_column, 'DD-MM-YYYY'), 'DD-MM-YYYY') from my_table 

Согласно комментариям, тип данных в datatable – DATE. Поэтому вы должны просто использовать: «select date_column from table;»

Теперь, если вы выполните выбор, вы вернете тип данных даты, который должен быть тем, что вам нужно для .xsd.

Культурно-зависимое формирование даты должно быть сделано в GUI (большинство языков имеют удобные способы сделать это), а не в select-statement.

В принципе, столбец Data in a Date в Oracle можно хранить в любом пользовательском формате или хранить по умолчанию. Все зависит от параметра NLS.

Текущий формат можно увидеть: SELECT SYSDATE FROM DUAL;

Если вы попытаетесь вставить инструкцию записи и вставки НЕ в ЭТОМ формате, тогда она даст: ORA-01843: не допустимая ошибка месяца. Поэтому сначала измените формат даты базы данных перед вставными операторами (я предполагаю, что у вас есть объемная загрузка операторов insert), а затем выполните скрипт insert.

Формат можно изменить: ALTER SESSION SET nls_date_format = ‘mm / dd / yyyy hh34: mi: ss’;

Также вы можете изменить настройки NLS из GUI разработчика SQL (Инструменты> предпочтение> база данных> NLS)

Ссылка: http://oracle.ittoolbox.com/groups/technical-functional/oracle-sql-l/how-to-view-current-date-format-1992815

Это сработало для меня! Вы можете преобразовать в тип данных, которым вы хотите быть датой или строкой

 to_char(TO_DATE(TO_CHAR(end_date),'MM-DD-YYYY'),'YYYY-MM-DD') AS end_date 
 SELECT TO_DATE(TO_CHAR(date_column,'MM/DD/YYYY'), 'YYYY-MM-DD') FROM table; 

если вам нужно изменить формат даты вывода столбца, просто используйте to_char

Форматы аргументов (параметров) функций « Справочник по Oracle PL/SQL

Числовые форматы (для fmt аргумента функции TO_CHAR)

Элемент Пример    Описание
------- --------- ----------------------------------------------------------
9       9999      Количество цифр, определяющих ширину вывода. 
0       0999      Вывод ведущих нулей.
$       $9999     Вывод перед значением знака доллара.
B       B9999     Вывод пробелов вместо ведущих нулей.
MI      9999MI    Вывод знака "-" после отрицательных чисел.
S       S9999     Вывод "+" для положительных чисел и "-" для отрицательных.
PR      9999PR    Вывод отрицательных чисел в <угловых скобках>.
D       99D99     Вывод десятичного разделителя.
G       9G999     Вывод разделителя групп (например, триад в денежных данных).
C       C999      Вывод символа интернациональной денежной единицы.
L       L999      Вывод конкретного денежного символа.
Запятая 9,999     Вывод запятой в указанной позиции.
Точка   99.99     Вывод точки в указанной позиции.
V       999V99    Умножение на 10 в N-ой степени, где N - задается в виде
                  количества девяток после 'V'.
EEEE    9&999EEEE Вывод в экспоненциальной форме.
RN (rn) RN        upper- or lower-case Roman numerals (numbers in range 1..3999).
DATE    'DATE`    Returns value converted from Julian date to 'MM/DD/YY' date format.
DATE    DATE      Высвечивание в формате даты 'MM/DD/YY'. Для дат,хранящихся
                  как числовые величины (ORACLE версия 2).

Символьные форматы

Символьный формат состоит из буквы ‘A’ и следующего за ней указания ширины
строки, столбца или выражения в символах. Если значение не укладывается в
указанную ширину, оно будет сдвинуто или обрезано в зависимости от того была
ли выполнена установка SET WRAP или SET TRUNC.

Форматы дат и времени

Формат              Описание
------------------- ----------------------------------------
SCC или СС          Век; 'S'- префикс перед датой (до н.э.) с'-'.
YYYY или SYYYY      Год; 'S'- префикс перед датой (до н.э.) с'-'.
YYY или YY или Y    Последние 3, 2 или 1 цифра(ы) года.
IYYY                4-цифры года в стандарте ISO.
IYY или IY или I    Последние 3, 2 или 1 цифра(ы) года в стандарте ISO.
Y,YYY               Год с запятой в данной позиции. 
SYEAR или YEAR      Год прописью. 'S'-префикс перед датой (до н.э.) с'-'.
BC или AD           BC/AD - (до н.э.) / ( н.э.).
B.C. или A.D.       Аналогично BC/AD.
Q                   Квартал (четверть) года.
MM                  Номер месяца.
RM                  Номер месяца римскими цифрами (I..XII; JAN=I).
MONTH               Имя месяца, дополненное пробелами до девяти символов.
MON                 Трехбуквенная аббревиатура имени месяца (JAN,FEB,...).
WW или W            Неделя года (1-52) или месяца (1-5).
IW                  Неделя года в стандарте ISO (1..21 или 1..53).
DDD DD или D        Номер дня года (1-366), месяца (1-31) или недели (1-7).
DAY                 Наименование дня, дополненное пробелами до 9 символов.
DY                  Трехбуквенная аббревиатура наименования дня.
J                   День по Юлианскому календарю; количество дней от
                      31 декабря 4713 до н.э.
AM или PM           Указатель часового пояса.
A.M. или P.M.       Указатель часового пояса с периодами.
HH или Hh22         Время суток, интервал 1-12.
Hh34                Время суток, интервал 0-23.
MI                  Минуты (0-59).
SS или SSSSS        Секунды (0-59) или после полуночи (0-86399).
-/.,;:              Пунктуация, которая воспроизводится в результате.
"...текст..."       Строка  в кавычках, которая воспроизводится в результате.

Префиксы и суффиксы, используемые в форматах

Префикс и суффиксы, которые могут быть добавлены к перечисленным выше кодам:
------------------------------------------------------------------------------
FM             "Fill mode" (режим наполнения). Указанный перед MONTH или DAY,
               подавляет пробелы, оставляя только результат фактической длины.
FX             "Format exact". Указанный в начале формата для функции TO_DATE,
               проверяет соответствует ли преобразуемое значение заданному
               формату. При несоответствии (например, лишние пробелы, другие
               разделители и т.п. ) - отвергает преобразование.
TH             Порядковое число (напр.,"DDTH" для "4TH").
SP             Число прописью (напр.,"DDSP" для "FOUR")
SPTH или THSP  Порядковое число прописью (напр., "DDSPTH") для "FOURTH").

Наличие заглавных букв в аббревиатурах или в словах прописью определяется
наличием заглавных букв в соответствующем форматном элементе.
Например, «DAY» дает «MONDAY», «Day» дает «Monday» и «day» дает «monday».
Модель формата даты может также включать в себя знаки пунктуации, такие
как дефис, косую черту, запятые и символьные константы, заключенные в кавычки
(не в апострофы). Пунктуация и константы появляются при выводе.
Например, DDth «of» Month, YYYY   дает  15th of February, 1986.

Запись опубликована 04.01.2010 в 10:18 дп и размещена в рубрике Oracle7 краткий справочник. Вы можете следить за обсуждением этой записи с помощью ленты RSS 2.0. Можно оставить комментарий или сделать обратную ссылку с вашего сайта.

Преобразование даты и времени с помощью SQL Server

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

SQL Server предоставляет ряд параметров, которые можно использовать для форматирования строки даты / времени.Одно из первых соображений — это фактическая необходимая дата / время. Самый распространенный — текущая дата / время с использованием getdate () . Это обеспечивает текущую дату и время в соответствии с сервером, предоставляющим дату и время. Если универсальная дата / время необходимо использовать getutcdate () . Чтобы изменить формат date, вы конвертируете запрошенную дату в строку и указываете номер формата, соответствующий в нужный формат.

Ниже приведен список форматов и пример вывода.Дата использования для всех этих примеров это «2006-12-30 00: 38: 54.840».

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

Если вы хотите получить список всех допустимых форматов даты и времени, вы можете использовать код ниже и измените @date на GETDATE () или любую другую дату, которую вы хотите использовать. Это выведет только действительные форматы.

ТОЛЬКО ДАТА ФОРМАТЫ
Формат # Запрос Образец
1 выберите преобразование (varchar, getdate (), 1) 30.12.06
2 выберите преобразование (varchar, getdate (), 2) 06.12.30
3 выберите преобразование (varchar, getdate (), 3) 30.12.06
4 выберите преобразование (varchar, getdate (), 4) 30.12.06
5 выберите преобразование (varchar, getdate (), 5) 30-12-06
6 выберите преобразование (varchar, getdate (), 6) 30 декабря 06
7 выберите преобразование (varchar, getdate (), 7) 30 декабря, 06
10 выберите преобразование (varchar, getdate (), 10) 12-30-06
11 выберите преобразование (varchar, getdate (), 11) 12.06.30
12 выберите преобразование (varchar, getdate (), 12) 061230
23 выберите преобразование (varchar, getdate (), 23) 30.12.2006
101 выберите преобразование (varchar, getdate (), 101) 30.12.2006
102 выберите преобразование (varchar, getdate (), 102) 2006 г.12.30
103 выберите преобразование (varchar, getdate (), 103) 30.12.2006
104 выберите преобразование (varchar, getdate (), 104) 30.12.2006
105 выберите преобразование (varchar, getdate (), 105) 30-12-2006
106 выберите преобразование (varchar, getdate (), 106) 30 декабря 2006 г.
107 выберите преобразование (varchar, getdate (), 107) 30 декабря 2006 г.
110 выберите преобразование (varchar, getdate (), 110) 30.12.2006
111 выберите преобразование (varchar, getdate (), 111) 30/12/2006
112 выберите преобразование (varchar, getdate (), 112) 20061230
ТОЛЬКО ВРЕМЯ ФОРМАТИРУЕТ
8 выберите преобразование (varchar, getdate (), 8) 00:38:54
14 выберите преобразование (varchar, getdate (), 14) 00: 38: 54: 840
24 выберите преобразование (varchar, getdate (), 24) 00:38:54
108 выберите преобразование (varchar, getdate (), 108) 00:38:54
114 выберите преобразование (varchar, getdate (), 114) 00: 38: 54: 840
ФОРМАТ ДАТЫ И ВРЕМЕНИ
0 выберите преобразование (varchar, getdate (), 0) 12 декабря 2006 г. 00:38
9 выберите преобразование (varchar, getdate (), 9) 30 декабря 2006 г. 12:38: 54: 840AM
13 выберите преобразование (varchar, getdate (), 13) 30 декабря 2006 г. 00: 38: 54: 840AM
20 выберите преобразование (varchar, getdate (), 20) 2006-12-30 00:38:54
21 выберите преобразование (varchar, getdate (), 21) 30 декабря 2006 г., 00:38:54.840
22 выберите преобразование (varchar, getdate (), 22) 30.12.06 00:38:54
25 выберите преобразование (varchar, getdate (), 25) 2006-12-30 00: 38: 54. 840
100 выберите преобразование (varchar, getdate (), 100) 30 декабря 2006 г. 00:38
109 выберите преобразование (varchar, getdate (), 109) 30 декабря 2006 г. 12:38: 54: 840AM
113 выберите преобразование (varchar, getdate (), 113) 30 декабря 2006 г. 00: 38: 54: 840
120 выберите преобразование (varchar, getdate (), 120) 2006-12-30 00:38:54
121 выберите преобразование (varchar, getdate (), 121) 30 декабря 2006 г., 00:38:54.840
126 выберите преобразование (varchar, getdate (), 126) 2006-12-30T00: 38: 54.840
127 выберите преобразование (varchar, getdate (), 127) 2006-12-30T00: 38: 54.840
ИСЛАМСКИЙ КАЛЕНДАРЬ ДАТЫ
130 выберите преобразование (nvarchar, getdate (), 130)
131 выберите преобразование (nvarchar, getdate (), 131) 12.10.1427 12: 38: 54: 840АМ

Формат даты SQL | Advanced SQL

Начиная с этого места? Этот урок является частью полного руководства по использованию SQL для анализа данных. Проверьте начало.

В этом уроке мы рассмотрим:

В этом уроке используются те же данные из предыдущих уроков, которые были извлечены из Crunchbase 5 февраля 2014 г. Подробнее об этом наборе данных.

Почему даты отформатированы первым годом

Если вы живете в Соединенных Штатах, вы, вероятно, привыкли видеть даты в формате ММ-ДД-ГГГГ или аналогичном формате с указанием первого месяца.Это странное соглашение по сравнению со стандартами остального мира, но оно не обязательно хуже, чем ДД-ММ-ГГГГ. Проблема с обоими этими форматами заключается в том, что, когда они хранятся в виде строк, они не сортируются в хронологическом порядке. Например, вот поле даты, хранящееся в виде строки. Поскольку месяц указан первым, инструкция ORDER BY не создает хронологический список:

  ВЫБРАТЬ постоянную ссылку,
       found_at
  ИЗ tutorial.crunchbase_companies_clean_date
 ЗАКАЗАТЬ от Found_at
  

Вы можете подумать, что преобразование этих значений из строки в даты может решить проблему, но на самом деле это не так просто.Режим (и большинство реляционных баз данных) форматирует даты как YYYY-MM-DD, формат, который имеет большой смысл, потому что он будет сортировать в том же порядке, хранится ли он как дата или как строка. Excel известен тем, что создает форматы даты, которые плохо работают с другими системами, поэтому, если вы экспортируете файлы Excel в CSV и загружаете их в Mode, вы можете часто сталкиваться с этим.

Вот пример из той же таблицы, но с полем с очищенной датой. Обратите внимание, что очищенное поле даты на самом деле сохраняется в виде строки, но все равно сортируется в хронологическом порядке:

  ВЫБРАТЬ постоянную ссылку,
       found_at,
       found_at_clean
  ИЗ учебника.crunchbase_companies_clean_date
 ЗАКАЗАТЬ found_at_clean
  

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

Сумасшедшие правила для дат и времени

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

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

  ВЫБРАТЬ КОМПАНИЮ. Постоянная ссылка,
       company.founded_at_clean,
       acquisitions.acquired_at_cleaned,
       acquisitions.acquired_at_cleaned -
         companies.founded_at_clean :: отметка времени AS time_to_acquisition
  ОТ tutorial.crunchbase_companies_clean_date компании
  ПРИСОЕДИНЯЙТЕСЬ к tutorial.crunchbase_acquisitions_clean_date приобретения
    ПО приобретениям.company_permalink = companies.permalink
 ГДЕ found_at_clean НЕ ПУСТО
  

В приведенном выше примере вы можете видеть, что столбец time_to_acquisition — это интервал, а не другая дата.

Вы также можете ввести интервалы, используя функцию ИНТЕРВАЛ :

  ВЫБРАТЬ КОМПАНИЮ. Постоянная ссылка,
       company.founded_at_clean,
       companies.founded_at_clean :: отметка времени +
         ИНТЕРВАЛ '1 неделя' AS plus_one_week
  ОТ tutorial.crunchbase_companies_clean_date компании
 ГДЕ found_at_clean НЕ ПУСТО
  

Интервал определяется с помощью простых английских терминов, таких как «10 секунд» или «5 месяцев». Также обратите внимание, что добавление или вычитание столбца даты и столбца интервала приводит к другому столбцу даты , как в приведенном выше запросе.

Вы можете добавить текущее время (во время выполнения запроса) в свой код, используя функцию NOW () :

  ВЫБРАТЬ КОМПАНИЮ. Постоянная ссылка,
       company.founded_at_clean,
       СЕЙЧАС () - companies.founded_at_clean :: timestamp AS found_time_ago
  ОТ tutorial.crunchbase_companies_clean_date компании
 ГДЕ found_at_clean НЕ ПУСТО
  

Отточите свои навыки работы с SQL

Практическая задача

Напишите запрос, который подсчитывает количество компаний, приобретенных в течение 3, 5 и 10 лет с момента основания (в 3 отдельных столбцах).Включите также столбец для общего количества приобретенных компаний. Сгруппируйте по категориям и ограничьте только строками с датой основания.

Попробуй это Посмотреть ответ

Как отформатировать дату в T-SQL

База данных:
Операторы:
CONVERT (), FORMAT ()
Задача:

Вы хотите отображать значение даты в другом формате в SQL Server.

Пример:

В нашей базе данных есть таблица с именем company с данными в столбцах id (первичный ключ), name и start_date .

id имя start_date
1 Lisa Bank 2019-01-20
2 Кредитный финансовый институт 2018-03-14
3 Williams Holding 2019-10-28

Для каждой компании давайте преобразуем дату начала в новый формат, «ГГГГ / ММ / ДД», где ГГГГ — год из 4 цифр, ММ — месяц из 2 цифр, а DD — день из 2 цифр.

Решение 1:

Мы будем использовать функцию CONVERT () . Вот запрос, который вы должны написать:

ВЫБРАТЬ
  ПРЕОБРАЗОВАТЬ (NVARCHAR; начальная_дата; 111) КАК новая_дата
ОТ компании;
 

Вот результат:

имя start_date
Lisa Bank 2019/01/20
Кредитно-финансовый институт 14.03.2018
Williams Holding 2019/10 / 28
Обсуждение:

Используйте функцию CONVERT () , чтобы изменить формат даты из заданного столбца или выражения.

Эта функция принимает три аргумента:

  1. Новый тип данных (в нашем примере NVARCHAR).
  2. Выражение или имя столбца, содержащее дату для форматирования (в нашем примере столбец start_date ).
  3. Необязательный код стиля в виде целого числа. (В нашем примере стиль «111» отображает дату с помощью косой черты для разделения частей.)

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

код описание
101 30.11.2019
102 2019.11.30
103 30.11.2019
104 30.11.2019
105 30-11-2019
110 30.11.2019
111 30.11.2019

Полный список стилей форматирования можно найти в документации T-SQL.

Приведенный выше запрос изменил формат даты Lisa Bank 2019-01-20 на строку, содержащую дату «2019/01/20».

Решение 2:

В SQL Server 2012 и более поздних версиях вы можете использовать функцию FORMAT () для изменения форматов даты и времени. Используйте символы ниже, чтобы указать желаемый формат:

образец описание
dd день в диапазоне 01-31
MM месяц в диапазоне 01-12
гг год из 2 цифр
гггг год из 4 цифр
HH Час в диапазоне 00-23
мм минут в диапазоне 00-59
сс секунд в диапазоне 00-59

Вот запрос, который можно написать с помощью FORMAT ():

ВЫБРАТЬ
  FORMAT (start_date, ‘yyyy-MM-dd’) КАК новая_дата
ОТ компании;
 

Первый аргумент — это значение типа datetime / date / time для переформатирования.Вторая — это строка, содержащая образец нового формата. Эта функция возвращает тип данных NVARCHAR. Используйте FORMAT () , если вы работаете с SQL Server 2012 или более поздней версии и хотите преобразовать дату / время в строки, содержащие отформатированные даты / время.

TO_DATE — Преобразование строки в Datetime — Переход с Oracle на SQL Server

В Oracle функция TO_DATE преобразует строковое значение в значение типа данных DATE, используя указанный формат.В SQL Server вы можете используйте функцию CONVERT или TRY_CONVERT с соответствующим стилем даты и времени.

Оракул :

 - Укажите строку даты и времени и ее точный формат
  ВЫБРАТЬ TO_DATE ('2012-06-05', 'ГГГГ-ММ-ДД') FROM dual; 

SQL Server :

 - Укажите строку даты и времени и стиль 102 (формат ANSI), вызывает ошибку, если преобразование не удается
  ВЫБРАТЬ ПРЕОБРАЗОВАТЬ (ВРЕМЯ, '2012-06-05', 102);

  - TRY_CONVERT доступен с SQL Server 2012 (возвращает NULL в случае сбоя преобразования)
  ВЫБЕРИТЕ TRY_CONVERT (DATETIME, '2012-06-05', 102); 

Сводка преобразования Oracle TO_DATE в SQL Server:

Oracle SQL Server
Синтаксис TO_DATE ( строка , формат ) CONVERT (DATETIME, string , style )
TRY_CONVERT (DATETIME, строка , стиль )
Формат по умолчанию Указан NLS_DATE_FORMAT Распознает множество форматов

Обратите внимание, что функция TRY_CONVERT доступна с SQL Server 2012.

Последнее обновление : Oracle 11g R2 и Microsoft SQL Server 2012

Oracle TO_DATE поддерживает следующие спецификаторы формата:

Oracle TO_DATE Указатель формата
ГГГГ Год из 4 цифр
ГГ Год из 2 цифр
RRRR 4-значный или 2-значный год, 20-й век используется для лет 00-49, в противном случае 19-й
ПН Сокращенный месяц (январь — декабрь)
МЕСЯЦ Название месяца (январь — декабрь)
MM Месяц (1 — 12)
DY Сокращенный день (вс — сб)
DD День (1-31)
Hh34 Час (0-23)
ЧЧ или Чч22 Час (1–12)
MI Минуты (0-59)
SS Секунды (0-59)

В отличие от функции Oracle TO_DATE, которая позволяет создавать любую строку формата, используя спецификаторы формата (YYYY и MM i.e.), в SQL Server необходимо использовать стиль datetime , который определяет формат для всей строки даты и времени .

К счастью, большинство приложений используют типичные форматы даты и времени в Oracle, которые можно легко сопоставить со стилем формата даты и времени в SQL Server.

Вы можете использовать функции CONVERT и TRY_CONVERT для преобразования строки в значение типа datetime.

CONVERT вызывает ошибку, если не может распознать формат, а TRY_CONVERT в этом случае возвращает NULL:

SQL Server :

 - Укажите недопустимую строку даты и времени
  ВЫБРАТЬ ПРЕОБРАЗОВАТЬ (ДАТА ВРЕМЕНИ, 'ABC');
  # Msg 241, уровень 16, состояние 1, строка 1
  # Ошибка преобразования при преобразовании даты и / или времени из символьной строки. 
  ВЫБРАТЬ TRY_CONVERT (DATETIME, 'ABC');
  # NULL 

Обратите внимание, что при преобразовании строки в datetime и CONVERT, и TRY_CONVERT по умолчанию распознают форматы даты и времени ANSI / ISO с различными разделителями, поэтому не нужно указывать для них стиль.

Формат ANSI / ISO — год, месяц, день, час, минута, секунды, доли секунды (ГГГГ-ММ-ДД Чч34: MI: SS.FFF), где конечные части могут быть опущены, поэтому вы можете указать ГГГГ-ММ-ДД, или ГГГГ-ММ-ДД Чч34: MI и т. д.

SQL Server :

 - форматы даты ISO с различными разделителями, распознаваемыми по умолчанию (год, месяц, день)
  ВЫБРАТЬ ПРЕОБРАЗОВАТЬ (ВРЕМЯ, '2012-06-30');
  ВЫБРАТЬ ПРЕОБРАЗОВАТЬ (ДАТА, '2012/06/30');
  ВЫБРАТЬ ПРЕОБРАЗОВАТЬ (ВРЕМЯ, '2012.06.30');

  ВЫБРАТЬ ПРЕОБРАЗОВАТЬ (ВРЕМЯ, '2012-06-30 11:10');
  ВЫБРАТЬ ПРЕОБРАЗОВАТЬ (ВРЕМЯ, '2012-06-30 11:10:09');
  ВЫБРАТЬ ПРЕОБРАЗОВАТЬ (ВРЕМЯ, '2012-06-30 11: 10: 09.333');
  ВЫБРАТЬ ПРЕОБРАЗОВАТЬ (ВРЕМЯ, '2012/06/30 11: 10: 09.333');
  ВЫБРАТЬ ПРЕОБРАЗОВАТЬ (ДАТА, '2012.06.30 11: 10: 09.333 ');

  - Дата ISO без разделителей также распознается
   ВЫБРАТЬ ПРЕОБРАЗОВАТЬ (ВРЕМЯ, '20120630'); 

SQL Server также распознает формат даты и времени США (месяц, день, год и время) по умолчанию, поэтому вы не необходимо указать стиль 101:

SQL Server :

 - форматы даты США с различными разделителями, распознаваемыми по умолчанию (месяц, день, год)
  ВЫБРАТЬ ПРЕОБРАЗОВАТЬ (ВРЕМЯ, '06-30-2012 ');
  ВЫБРАТЬ ПРЕОБРАЗОВАТЬ (ДАТА, 30.06.2012);
  ВЫБРАТЬ ПРЕОБРАЗОВАТЬ (ДАТА ВРЕМЯ, '06.30.2012 »);

  ВЫБРАТЬ ПРЕОБРАЗОВАТЬ (ДАТА, '06-30-2012 11:10 ');
  ВЫБРАТЬ ПРЕОБРАЗОВАНИЕ (ВРЕМЯ, 30.06.2012 11:10:09);
  ВЫБРАТЬ ПРЕОБРАЗОВАНИЕ (ВРЕМЯ, '06. 30.2012 11: 10: 09.333 '); 

Также SQL Server по умолчанию распознает следующие форматы:

SQL Server

 SELECT CONVERT (ДАТА ВРЕМЕНИ, '17-ФЕВ-2013 ');
  # 2013-02-17 00: 00: 00. 000 

Вы можете сопоставить формат Oracle TO_DATE со стилем SQL Server CONVERT или TRY_CONVERT следующим образом:

Oracle TO_DATE Format SQL Server CONVERT и TRY_CONVERT Style
1 ГГГГ-ММ-ДД По умолчанию (стиль не указан) , 101, 102, 110, 111, 20, 120, 21 и 121
2 ГГГГ / ММ / ДД По умолчанию , 101, 102, 110, 111, 20, 120, 21 и 121
3 ГГГГ-ММ-ДД Чч34: MI: SS По умолчанию , 101, 102, 110, 111, 20, 120, 21 и 121
4 MM / DD / YYYY Hh34: MI: SS По умолчанию и 101
5 ДД-МН-ГГГГ По умолчанию , 106 и 113

Примеры конверсии:

Oracle SQL Server
1 TO_DATE (‘2012-07-18’, ‘YYYY-MM-DD’) CONVERT (DATETIME, ‘2012-07-18’)
2 TO_DATE (‘2012/07/18’, ‘YYYY / MM / DD’) CONVERT (DATETIME, ‘2012/07/18’)
3 TO_DATE (‘2012-07-18 13:27:18’, ‘YYYY-MM-DD Hh34: MI: SS’) CONVERT (DATETIME, ‘2012-07-18 13:27: 18 ‘)
4 TO_DATE (’07 / 18/2012 13:27:18 ‘,’ MM / DD / YYYY Hh34: MI: SS ‘) CONVERT (DATETIME, ’07 / 18/2012 13:27: 18 ‘)
5 TO_DATE (’17 -FEB-2013 ‘,’ DD-MON-YYYY ‘) CONVERT (DATETIME, ’17-FEB-2013′)

SQLines предлагает услуги и инструменты, которые помогут вам перенести базы данных и приложения.Для получения дополнительной информации свяжитесь с нами по адресу [email protected]

Автор Дмитрий Толпеко — август 2013 г. (Обновлено).

404 | Микро Фокус

  • Профессиональные услуги

    Сформируйте свою стратегию и трансформируйте гибридную ИТ-среду.


  • Профессиональные услуги по продуктам
  • Аналитика и большие данные

    Помогите вам внедрить безопасность в цепочку создания стоимости ИТ и наладить сотрудничество между ИТ-отделами, приложениями и службами безопасности.

  • Информационная безопасность

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

  • DevOps

    Ускорьте получение результатов гибридного облака с помощью услуг по консультированию, трансформации и внедрению.

  • Консультации по цепочке создания стоимости IT4IT

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

  • Управление доставкой приложений

    Услуги стратегического консалтинга для разработки вашей программы цифровой трансформации.

  • Жизненный цикл мобильного приложения

    Полнофункциональное моделирование сценариев использования с предварительно созданными интеграциями в портфеле программного обеспечения Micro Focus, демонстрирующее реальные сценарии использования

  • Управление гибридным облаком и брокерские услуги

    Услуги экспертной аналитики безопасности, которые помогут вам быстро спроектировать, развернуть и проверить реализацию технологии безопасности Micro Focus.

  • Автоматизация ЦОД

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

  • Управление операциями

    Анализируйте большие данные с помощью аналитики в реальном времени и ищите неструктурированные данные.

  • Управление услугами

    Анализируйте большие данные с помощью аналитики в реальном времени и ищите неструктурированные данные.

  • Vertica

    Анализируйте большие данные с помощью аналитики в реальном времени и ищите неструктурированные данные.

  • Глобальная аутентификация продукта

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

  • Управляемые службы

    Анализируйте большие данные с помощью аналитики в реальном времени и ищите неструктурированные данные.

  • Модельные офисы

    Комплексные услуги по работе с большими данными для продвижения вашего предприятия.

  • Функции даты SQL SFMC | Mateusz Dąbrowski

    Управляйте датами с помощью встроенных функций SQL. Пусть запрос сделает свою работу.

    Реализация Salesforce Marketing Cloud SQL не поддерживает пользовательские функции.Однако есть несколько встроенных функций, которые полезны в повседневной работе с запросами.

    Здесь я рассмотрю только избранные функции даты, которые я считаю наиболее полезными для целей автоматизации маркетинга. Они помогут вам найти текущую дату, вычислить новую или отформатировать ее в соответствии с вашими потребностями.

    GETDATE & GETUTCDATE #

    Функция GETDATE — самый простой способ получить текущую временную метку в вашем запросе.

    GETDATE () получает время сервера.Для Salesforce Marketing Cloud это означает центральное стандартное время (UTC-6) без изменений между стандартным и летним временем. Его нельзя изменить, даже если в программе настройки установлены часовой пояс и региональные параметры.

    Вы можете получить дату и время с соответствующей информацией о смещении, используя функцию SYSDATETIMEOFFSET () . Он вернет то же datetime, что и GETDATE () , но в формате, показывающем смещение часового пояса: 2020-12-28 15: 08: 01.7239173 -06: 00 .

    Вы можете увидеть 24-часовой формат часов, миллисекунды и смещение UTC-6 в конце.Эта последняя информация будет полезна для преобразования часовых поясов с помощью функции AT TIME ZONE .

    Вы также можете использовать `TODATETIMEOFFSET ‘для работы со стандартным GETDATE .

    Функция GETUTCDATE работает так же, как GETDATE , но возвращает datetime в часовом поясе UTC.

    Оба возвращают объект datetime (например, 30 октября 2020 г. 1:15 AM ), поэтому преобразование не требуется для использования других функций даты в результате этой функции.

    Однако вы можете ограничить вывод либо датой, либо частью времени, используя функции CONVERT или FORMAT .

    DATEADD #

    Функции DATEADD позволяют добавлять и вычитать значения даты.

    Добавить семь дней к текущей дате UTC

    Для этого требуются три вещи:

    1. Часть даты — Элемент даты, который будет изменен
    2. Число — Целое число (или выражение, оцениваемое как целое) для интервала
    3. Дата — Исходная дата, когда функция DATEADD изменится.Это может быть любой тип данных даты. Вывод будет того же типа.

    DATEADD не учитывает смещение часового пояса.

    Однако, если вы меняете дату с 31-го дня месяца на месяцы, а конечный месяц короче, SQL учтет это и вернет последний день данного месяца.

    DATEADD особенно полезен при использовании с оператором WHERE , поскольку он позволяет динамически фильтровать записи:

    Найти всех подписчиков, которые присоединились в течение последнего месяца

    Очень похожий расчет даты также доступен с DATEADD ( ) Функция AMPScript.В зависимости от варианта использования подумайте, хотите ли вы управлять датой в расширении данных или только в сообщении.

    DATEPART #

    Функция DATEPART возвращает выбранную часть предоставленной даты.

    Найти всех подписчиков, присоединившихся в 2020 г.

    Он выводит целое число, поэтому при сравнении обязательно используйте число.

    Также есть три ярлыка для наиболее популярных вариантов использования: ГОД () , МЕСЯЦ () и ДЕНЬ () .

    Найти всех подписчиков, присоединившихся в 2020 году — более короткий подход

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

    Детали даты #

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

    Часть даты Сокращения
    ГОД гг, гггг
    КВАРТАЛ qq, q
    МЕСЯЦ мм, м
    ДЕНЬ
    ДЕНЬ , y
    DAY dd, d
    WEEK wk, ww
    WEEKDAY dw, w
    HOUR hh
    MINUTE mi, n
    СЕКУНДА сс, с
    МИЛЛИСЕКУНД мс
    МИКРОСЕКУНД мкс
    НАНОСЕКУНД нс

    ДНЕЙ считаются одной и той же частью даты и возвращают одинаковое значение.

    Для 99% потребностей SFMC вам подойдет ГОД , МЕСЯЦ , ДЕНЬ , ЧАС и МИНУТА . Использование только тех, у кого есть полное имя, сделает ваши запросы понятными и понятными для всех.

    DATEDIFF #

    Функция DATEDIFF вычисляет разницу между двумя датами.

    Необходимо указать часть даты, используемую для расчета, и две даты (порядок начала и окончания).

    Вы можете использовать его в выписке SELECT :

    Проверить, как долго кто-то был подписчиком

    Вы можете использовать его в выписке WHERE :

    Получить всех, кто достиг одного года в списке подписки

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

    Существует предел того, насколько большой может быть разница. Если вы перейдете к части даты SECOND , максимальная разница во времени запроса составит 68 лет, 19 дней, 3 часа, 14 минут и 7 секунд. Для большинства случаев использования это не должно быть проблемой в сценариях использования Marketing Cloud.

    DATENAME #

    Функции DATENAME возвращают значение указанной datepart с заданной даты.

    Захватить полное имя дня

    Может быть полезно быстро сократить дату до только важной части (например, год для персонализации годовщины или сохранения корзин для годовщин). Однако его выдающаяся функция возвращает название дня для заданной даты благодаря части даты WEEKDAY .

    Создайте автоматизацию, которая будет записывать собрания по выходным для напоминания в пятницу

    AT TIME ZONE #

    Функция AT TIME ZONE предоставляет две невероятные функции:

    1. Она может предоставить информацию о смещении часового пояса для любой даты и времени, когда эти данные отсутствуют.
    2. Он может преобразовывать дату и время со смещением в другой часовой пояс.

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

    AT TIME ZONE всегда выводит тип данных DATETIMEOFFSET . Если вам нужен другой тип / формат, используйте CONVERT или FORMAT .

    Добавьте смещение с помощью AT TIME ZONE #

    Когда вы работаете с часовыми поясами, вы хотите иметь смещение для полей даты и времени, которые вы используете.К сожалению, в большинстве случаев его нет. Ни системные временные метки Salesforce Marketing Cloud, ни популярная функция GETDATE не предоставляют информацию о смещении.

    Вы можете быстро исправить это с помощью AT TIME ZONE . Когда вы применяете эту функцию к datetime без часового пояса, она будет предполагать, что вы ее определяете, и возвращает значение с соответствующим смещением.

    Магия перехода на летнее время

    В приведенном выше фрагменте мы КОНВЕРТИРУЕМ даты в datetime без смещения.Затем функция AT TIME ZONE добавляет смещение и вычисляет изменение смещения перехода на летнее время за вас.

    AT TIME ZONE vs TODATETIMEOFFSET #

    Как ни удивительно, но учет летнего времени является проблемой при работе с системными датами Salesforce Marketing Cloud (включая GETDATE ).

    Salesforce Marketing Cloud использует центральное стандартное время (UTC-6) без изменений между стандартным и летним временем.Значит, отличная фишка AT TIME ZONE работает против нас.

    Однако есть еще одна функция, которая может решить эту проблему — TODATETIMEOFFSET . Это упрощенная версия AT TIME ZONE , которая добавляет произвольное смещение без какой-либо логики перехода на летнее время. Так же, как и хотелось бы для дат системы SFMC.

    Чтобы использовать его, укажите дату и время и смещение (например, '-06: 00' или '+01: 00' ):

    Нет волшебства перехода на летнее время

    Конечно, для любого даты и времени значения, которые включают летнее время — загруженное с веб-сайта или вашего хранилища данных — В ЧАСОВОЙ ПОЯС будет лучшим решением.

    Изменение часового пояса с помощью AT TIME ZONE #

    AT TIME ZONE также полезно для изменения часового пояса даты и времени со смещением.

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

    Изменить дату и время CST со смещением на CET

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

    Вы можете использовать обе функции AT THE TIMEZONE в одной строке, чтобы применить часовой пояс к дате и времени без смещения и преобразовать его в другой часовой пояс, используя функцию дважды:

    Сначала примените часовой пояс. Затем измените часовой пояс

    Это работает, потому что первое выполнение функции добавляет смещение с AT TIME ZONE . Во-вторых, использует вывод с примененным смещением и изменяет часовой пояс.

    Конечно, для дат системы Salesforce Marketing Cloud нам все еще нужен обходной путь:

    Нет волшебства перехода на летнее время, но все еще меняет часовой пояс

    Доступные часовые пояса #

    Вы можете выбрать один из 140 доступных часовых поясов: Строка дат Стандартное время , UTC-11 , Алеутское стандартное время , Гавайское стандартное время , Маркизское стандартное время , Аляскинское стандартное время , UTC-09 , Тихоокеанское стандартное время (Мексика) , UTC-08 , Тихоокеанское стандартное время , Горное стандартное время США , Горное стандартное время (Мексика) , Горное стандартное время , Центральноамериканское стандартное время , Центральное стандартное время , Пасха Островное стандартное время , Центральное стандартное время (Мексика) , Центральное стандартное время Канады , SA Тихоокеанское стандартное время , Восточное стандартное время (Мексика) , Восточное стандартное время , Стандартное время Гаити , Кубинское стандартное время , Восточное стандартное время США , Парагвайское стандартное время , Атлантическое стандартное время , Венесу ela Standard Time , Central Brazilian Standard Time , SA Western Standard Time , Pacific SA Standard Time , Стандартное время Теркс и Кайкос , Стандартное время Ньюфаундленда , Стандартное время Токантинса , E. Стандартное время Южной Америки , SA Восточное стандартное время , Стандартное время Аргентины , Стандартное время Гренландии , Стандартное время Монтевидео , Стандартное время Магалланеса , Стандартное время Сен-Пьера , Стандартное время Баии , UTC-02 , Среднеатлантическое стандартное время , Стандартное время Азорских островов , Стандартное время Кабо-Верде , UTC , Стандартное время Марокко , Стандартное время по Гринвичу , Стандартное время по Гринвичу , W.Европейское стандартное время , Центральноевропейское стандартное время , Романтическое стандартное время , Центральноевропейское стандартное время , Вт. Стандартное время Центральной Африки , Стандартное время Намибии , Стандартное время Иордании , Стандартное время GTB , Стандартное время Ближнего Востока , Стандартное время Египта , E. Стандартное время Европы , Стандартное время Сирии , Стандартное время Западного берега , Стандартное время Южной Африки , Стандартное время FLE , Стандартное время Израиля , Стандартное время Калининграда , Стандартное время Ливии , Стандартное арабское время , Стандартное время Турции , Стандартное арабское время , Стандартное время Беларуси , Стандартное время России , E.Африканское стандартное время , Стандартное время Ирана , Арабское стандартное время , Астраханское стандартное время , Азербайджанское стандартное время , Часовой пояс России 3 , Стандартное время Маврикия , Саратовское стандартное время , Грузинский Стандартное время , Стандартное время Кавказа , Стандартное время Афганистана , Стандартное время Западной Азии , Стандартное время Екатеринбурга , Стандартное время Пакистана , Стандартное время Индии , Стандартное время Шри-Ланки , Непал Стандартное время , Центральноазиатское стандартное время , Бангладешское стандартное время , Омское стандартное время , Мьянманское стандартное время , ЮВ Азиатское стандартное время , Алтайское стандартное время , W. Стандартное время Монголии , Стандартное время Северной Азии , С. Стандартное время Центральной Азии , Стандартное время Томска , Китайское стандартное время , Североазиатское восточное стандартное время , Сингапурское стандартное время , W. Стандартное время Австралии , Стандартное время Тайбэя , Стандартное время Улан-Батора , Стандартное время Северной Кореи , Центральное западное время Австралии, стандартное время , Стандартное время Забайкалья , Стандартное время Токио , Стандартное время Кореи , Якутск, поясное время , Центробанк.Стандартное время Австралии , Центральное стандартное время Австралии , E. Стандартное время Австралии , Восточное стандартное время Австралии , Западно-тихоокеанское стандартное время , Стандартное время Тасмании , Владивостокское стандартное время , Стандартное время Лорд-Хау Время , Бугенвильское стандартное время , Россия Часовой пояс 10 , Магаданское стандартное время , Норфолкское стандартное время , Сахалинское стандартное время , Центрально-тихоокеанское стандартное время , Россия Часовой пояс 11 , Новое Стандартное время Зеландии , UTC + 12 , Стандартное время Фиджи , Стандартное время Камчатки , Стандартное время островов Чатем , UTC + 13 , Стандартное время Тонги , Стандартное время Самоа , линия Стандартное время островов .

    Не беспокойтесь о названиях летнего времени — AT TIME ZONE используйте стандартные названия и позаботится о летнем времени.

    ФОРМАТ

    с датами #

    ФОРМАТ работает только с датой, временем и числовыми значениями, выводит строку и требует:

    1. Значение для форматирования (может быть столбцом, строкой или функцией)
    2. Описатель формата должен быть применено
    3. Дополнительно — код культуры ISO

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

    Вместо создания сложной логики AMPScript для адаптации дат, отформатируйте их

    В приведенном выше примере первые две функции FORMAT возвращают дату в том же формате — 30/10/2020 — с использованием вручную введенного значения, другой, взяв текущую дату в формате UTC из функции.

    Последняя строка выводит Freitag, 7. Februar 2020 . Удобно запускать его с CASE , чтобы превратить короткую дату в расширенную, персонализированную на языке пользователя.

    Стандартные форматы даты #

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

    Спецификатор формата Описание Пример (для культуры США)
    ‘d’ Краткая дата 30.10.2020
    ‘D’ Длинная дата Пятница, 30 октября 2020 г.
    ‘m’ / ‘M’ День месяца 30 октября
    ‘y’ / ‘Y’ Год Месяц Октябрь 2020
    ‘t’ Кратковременное 14:15
    ‘T’ Долгое время 14:15:30
    ‘g’ Общее короткое время 30.10.2020 14:15
    ‘G’ Общее долгое время 30.10.2020 14:15:30
    ‘f’ Полностью короткое время 30 октября 2020 г. 14:15
    ‘F’ Fu ll long time Пятница, 30 октября 2020 г. 14:15:30
    ‘r’ / ‘R’ RFC1123 Пт, 30 октября 2020 г. 14:15:30 GMT

    Как выделено в заголовке таблицы — примеры относятся к форматированию культуры США по умолчанию SFMC. Если вы добавите конкретный код культуры в качестве третьего параметра, результат будет другим, поскольку в разных странах разные значения по умолчанию для порядка элементов и стиля разделителя.

    Полный список описателей стандартного формата даты можно найти на страницах документов Microsoft .Net.

    Пользовательские форматы даты #

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

    Спецификатор формата Описание Пример (для культуры США)
    ‘d’ День месяца 1
    ‘dd’ День месяца с отсчетом от нуля 01
    ‘ddd’ Сокращенный день месяца Пн
    ‘dddd’ Полный день месяца Понедельник
    ‘M’ Месяц 1
    ‘MM’ Месяц с нулевым отсчетом 01
    ‘MMM’ Сокращенный месяц Янв
    ‘MMMM’ Полный месяц Январь
    ‘yy’ Последние две цифры числа th e год 20
    ‘yyyy’ Год из четырех цифр 2020
    ‘h’ Час (12-часовой формат) 1
    ‘hh’ Ноль- базовый час (12-часовой формат) 01
    ‘tt’ Обозначение AM / PM AM
    ‘H’ Час (24-часовой формат) 13
    ‘HH’ Час с отсчетом от нуля (24-часовые часы) 01
    ‘м’ Минуты 1
    ‘мм’ Минуты с отсчетом от нуля 01
    ‘s’ Секунды 1
    ‘ss’ Секунды с отсчетом от нуля 01
    ‘:’ Разделитель времени ‘:’
    ‘/’ Разделитель даты ‘/’

    Опять же, примеры относятся к форматированию культуры США по умолчанию и могут выглядеть по-разному для разных культур (например, разделитель часов может быть автоматически изменен на . для Италии).

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

    Приведенный выше запрос вернет суббота (30 октября 2020 г.) - 02:15 .

    Полный список описателей настраиваемого формата даты можно найти на страницах документов Microsoft .Net.

    AMPScript использует очень похожее настраиваемое форматирование с функциями FORMAT () и FORMATDATE () . В зависимости от варианта использования подумайте, хотите ли вы управлять визуальным представлением даты в расширении данных или только в сообщении.

    Доступ к MS: функция форматирования (с датами)


    В этом руководстве MSAccess объясняется, как использовать функцию формата доступа (применительно к значениям даты) с синтаксисом и примерами.

    Описание

    Функция Microsoft Access Format принимает выражение даты и возвращает его в виде отформатированной строки.

    Синтаксис

    Синтаксис функции форматирования в MS Access:

     Формат (выражение, [формат, [firstdayofweek, [firstweekofyear]]]) 

    Параметры или аргументы

    выражение
    Значение для форматирования.
    формат

    Необязательно. Это формат, применяемый к выражению . Вы можете определить свой собственный формат или использовать один из названных форматов, предопределенных Access, например:

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

    Необязательно.Это значение, указывающее первый день недели. Если этот параметр опущен, функция Format предполагает, что воскресенье является первым днем ​​недели. Этот параметр может принимать одно из следующих значений:

    Константа Значение Пояснение
    vbUseSystem 0 Использует настройку NLS API
    VbВоскресенье 1 Воскресенье (по умолчанию, если параметр не указан)
    vbПонедельник 2 Понедельник
    vb Вторник 3 вторник
    vbСреда 4 среда
    vb Четверг 5 четверг
    vbПятница 6 Пятница
    vbСуббота 7 Суббота
    первая неделя года

    Необязательно.Это значение, указывающее первую неделю года. Если этот параметр опущен, функция Format предполагает, что неделя, содержащая 1 января, является первой неделей года. Этот параметр может принимать одно из следующих значений:

    Константа Значение Пояснение
    vbUseSystem 0 Использует настройку NLS API
    vbFirstJan1 1 Неделя, содержащая 1 января
    vbFirstFourDays 2 Первая неделя, в которой не менее 4 дней в году
    vbFirstFullWeek 3 Первая полная неделя года

    Возврат

    Функция Format возвращает строковое значение.

    Относится к

    Функцию форматирования можно использовать в следующих версиях Microsoft Access:

    • Access 2016, Access 2013, Access 2010, Access 2007, Access 2003, Access XP, Access 2000

    Пример

    Давайте посмотрим, как использовать функцию форматирования с датами в MS Access:

    Формат
     (# 17/04/2004 #, "Краткая дата")
      Результат:  '17.04.2004 '
    
    Формат (# 17.04.2004 #, "Длинная дата")
      Результат:  '17 апреля 2004 г.'
    
    Формат (# 17.04.2004 #, "гггг / мм / дд")
      результат:  '2004.04.17' 

    Пример в коде VBA

    Функцию форматирования можно использовать в коде VBA в Microsoft Access.

    Например:

     Dim LValue As String
    
    LValue = Format (Date; yyyy / mm / dd) 

    В этом примере переменная LValue теперь будет содержать дату в формате гггг / мм / дд.

    Пример в SQL / запросы

    Вы также можете использовать функцию форматирования в запросе в Microsoft Access.

    Например:

    В этом запросе мы использовали функцию Format следующим образом:

     Expr1: Format ([BirthDate], «yyyy / mm / dd») 

    Этот запрос отформатирует поле BirthDate как «гггг / мм / дд» и отобразит результаты в столбце с именем Expr1 .Вы можете заменить Expr1 более значимым именем столбца.

    Например:

     FormattedValue: Format ([BirthDate], «yyyy / mm / dd») 

    Результаты теперь будут отображаться в столбце с именем FormattedValue .

    Результаты этого запроса будут выглядеть примерно так:

    .

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

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

    Theme: Overlay by Kaira Extra Text
    Cape Town, South Africa