使用 SQL:2016 日期时间格式的 CAST ... FORMAT

Usage

CAST(<timestamp/date> AS <varchar/char/string> [FORMAT <template>]) CAST(<varchar/char/string> AS <timestamp/date> [FORMAT <template>])

Example

select cast(dt as string format 'DD-MM-YYYY') select cast('01-05-2017' as date format 'DD-MM-YYYY')

模板元素,又称令牌,又称模式,又称 SQL:2016 日期时间格式

Notes

对于所有令牌:
-除 AM/PM 和 T/Z 外,模式不区分大小写。有关更多详细信息,请参见这些部分。
-对于从字符串到日期时间的转换,不允许使用重复的格式令牌,包括令牌
含义相同但长度不同(“ Y”和“ YY”冲突)或不同
行为(“ RR”和“ YY”冲突)。

对于所有数字标记:
-Importing/输出的“预期长度”是字符中令牌的数量(例如,“ YYY”:3,
“ Y”:1,依此类推,但有一些 exception(请参见 MapSPECIAL_LENGTHS)。
-对于字符串到日期时间的转换,如果满足以下条件,则接受比预期少的数字 Importing
后跟定界符,例如格式=“ YYYY-MM-DD”,Importing=“ 19-1-1”,输出= 2019-01-01 00:00:00.
-对于从日期时间到字符串的转换,输出留有零填充,例如格式=“ DD SSSSS”,
Importing= 2019-01-01 00:00:03,输出=“ 01 00003”。

接受的格式令牌

注意:-“ |”表示“或”。
-数字标记的“定界符”表示任何非数字字符或 Importing 结尾。
-单词令牌和模式可互换使用。

A.1.数值时态标记

YYYY
4-digit year
-对于从字符串到日期时间的转换,将获得 1 位,2 位和 3 位 Importing 的前缀数字
从当前日期开始
例如。Importing='9-01-01',模式='YYYY-MM-DD',当年= 2020,输出= 2029-01-01 00:00:00

YYY
一年的最后 3 位数字
-从当前日期获取前缀数字。
-可接受的位数少于 3,类似于 YYYY。

YY
一年的后两位数字
-从当前日期获取 2 个前缀数字。
-可接受的位数少于 2,类似于 YYYY。

Y
一年的最后一位数字
-从当前日期获取 3 个前缀数字。

RRRR
4 位舍入年份
-字符串到日期时间的转换:
-如果提供 2 位数字,则其作用类似于 RR。
-如果提供 1,3 或 4 位数字,则其作用类似于 YYYY。
-对于日期时间到字符串的转换,其作用类似于 YYYY。

RR
2 位舍入年份
-字符串到日期时间的转换:
- Semantics:
Importing:当年的后两位数字:输出的前两位数字:
0 至 49 00 至 49 本年的前 2 位数字
0 至 49 50 至 99 本年 1 的前两位数字
50 至 99 00 至 49 本年的前两位数字-1
50 至 99 50 至 99 本年的前两位数字
-如果提供的 1 位数字年份后跟定界符,则使用 1 位数字年份退回到 YYYY
input.
-对于日期时间到字符串的转换,其作用类似于 YY。

MM
Month (1-12)
-对于字符串到日期时间的转换,与 DDD,MONTH,MON 冲突。

DD
每月的一天(1-31)
-对于从字符串到日期时间的转换,与 DDD 冲突。

DDD
一年中的哪一天(1-366)
-对于字符串到日期时间的转换,与 DD 和 MM 冲突。

HH
一天中的时间(1-12)
-如果未提供 AM/PM,则默认为 AM。
-在字符串到日期时间的转换中,与 SSSSS 和 HH24 冲突。

HH12
一天中的时间(1-12)
See HH.

HH24
一天中的小时(0-23)
-在字符串到日期时间的转换中,与 SSSSS,HH12 和 AM/PM 冲突。

MI
分钟(0-59)
-在字符串到日期时间的转换中,与 SSSSS 冲突。

SS
分钟(0-59)
-在字符串到日期时间的转换中,与 SSSSS 冲突。

SSSSS
第二天(0-86399)
-在字符串到日期时间的转换中,与 SS,HH,HH12,HH24,MI,AM/PM 冲突。

FF[1..9]
秒的小数
-1..9 表示小数位数。 “ FF”(未指定位数)也是
accepted.
-在日期时间到字符串的转换中,“ FF”将省略尾随的零,如果秒则输出“ 0”
值为 0.
-在字符串到日期时间的转换中,如果后面跟一个数字,则接受的位数比预期的少
定界符。 “ FF”的行为类似于“ FF9”。

AM|A.M.|PM|P.M.
子午线 Metrics(或 AM/PM)
-日期时间到字符串的转换:
-AM 和 PM 表示模式中完全相同的内容。
例如 Importing= 2019-01-01 20:00,格式=“ AM”,输出=“ PM”。
-保留模式字符串中提供的确切格式(大写和长度)。如果是下午
处于模式中,我们希望是上午或下午。在输出中;如果 AM 处于模式中,我们期望
输出中的 AM 或 PM。如果大小写混合(Am 或 aM),则输出大小写将匹配
模式首字符的大小写(Am => AM,aM => am)。
-字符串到日期时间的转换:
-与 HH24 和 SSSSS 冲突。
-模式中的哪个子午线指示器都没有关系。
例如。 input =“ 2019-01-01 11:00 p.m.”,pattern =“ YYYY-MM-DD HH12:MI AM”,
output=2019-01-01 23:00:00
-如果启用了 FX,则 Importing 长度必须与图案的长度匹配。例如模式= AMImporting= AM
不接受,但 input = pm 是。
-由于特殊状态,未列为临时字符:不会用空格填充
在格式化时,大小写在日期时间到字符串转换的处理方式有所不同。

D
星期几(1-7)
-1 表示星期日,2 表示星期一,依此类推。
-不允许将字符串转换为日期时间。

Q
季度(1-4)
-不允许将字符串转换为日期时间。

WW
每年的星期对齐(1-53)
-第 1 周从 1 月 1 日开始,到 1 月 7 日结束,依此类推。
-不允许将字符串转换为日期时间。

W
每月的星期对齐(1-5)
-第一周从该月的 1 号开始,到 7 号结束,依此类推。
-不允许将字符串转换为日期时间。

IYYY
4 位 ISO 8601 周编号年份
-返回与 ISO 周编号(IW)有关的年份,即整周(
星期日),其中包含公历年的 1 月 4 日。
-与 YYYY 的行为类似,即日期时间到字符串的转换,前缀数字 1、2,
和 3 位数 Importing 是从当前的星期编号年份获得的。
-对于字符串到日期时间的转换,需要 IW 和 ID | DAY | DY。与所有其他日期发生冲突
模式(请参见“基于日期的模式列表”)。

IYY
ISO 8601 周编号年份的后 3 位数字
-见 IYYY。
-与 YYY 相似,在日期时间到字符串的转换中,获得了前缀数字
从当前的星期编号年份开始,可以接受 1 或 2 位数的 Importing。

IY
ISO 8601 周编号年份的后两位数字
-见 IYYY。
-与 YY 相似,在日期时间到字符串的转换中,获得前缀数字
从当前的星期编号年份开始,可以接受 1 位数的 Importing。

I
ISO 8601 周编号年的最后一位数字
-见 IYYY。
-与 Y 的行为类似,对于日期时间到字符串的转换,获得前缀数字
从当前的星期编号年份开始。

IW
一年中的 ISO 8601 周(1-53)
-从最接近该年 1 月 1 日的星期一开始。
-对于从字符串到日期时间的转换,如果 Importing 年份中不存在 Importing 周,则 Importing
错误将被抛出。例如 2019 年有 52 周;与 pattern =“ iyyy-iw-id”
Importing=“ 2019-53-2”不被接受。
-对于字符串到日期时间的转换,需要 IYYY | IYY | IY | I 和 ID | DAY | DY。与其他所有冲突
日期模式(请参阅“基于日期的模式列表”)。

ID
ISO 8601 星期几(1-7)
-1 是星期一,依此类推。
-对于字符串到日期时间的转换,需要 IYYY | IYY | IY | I 和 IW。与其他所有冲突
日期模式(请参阅“基于日期的模式列表”)。

A.2.角色时态

时间元素,但说明清楚。
-对于从日期时间到字符串的转换,模式的大小写必须与列出的格式之一匹配
(例如不接受 mOnTh),以避免产生歧义。输出右尾有空格
除非图案用填充模式修改器(FM)标记。
-对于从字符串到日期时间的转换,模式的大小写无关紧要。

MONTH|Month|month
月份的名称
-对于从日期时间到字符串的转换,将包括最大为 9(长度为
一年中最长的月份名称:“ 9 月”)。根据情况考虑
以下示例(模式=>输出):
-月=>一月
-月=>一月
-月=>一月
-对于从字符串到日期时间的转换,既不涉及模式,也不涉及 Importing
被考虑在内。
-对于从字符串到日期时间的转换,与 MM 和 MON 冲突。

MON|Mon|mon
月份的缩写名称
-对于日期时间到字符串的转换,根据以下内容考虑大小写
示例(模式=>输出):
-MON => JAN
-星期一=>一月
-星期一=> jan
-对于从字符串到日期时间的转换,既不涉及模式,也不涉及 Importing
被考虑在内。
-对于字符串到日期时间的转换,与 MM 和 MONTH 冲突。

DAY|Day|day
星期几的名称
-对于日期时间到字符串的转换,将包括尾随空格,直到 length 为 9(长度为
一周中最长的一天的名称:“星期三”)。根据以下情况考虑大小写
示例(模式=>输出):
-DAY = SUNDAY
-天=周日
-天=周日
-对于从字符串到日期时间的转换,既不涉及模式,也不涉及 Importing
被考虑在内。
-除 IYYY | IYY | IY | I 和 IW 外,不允许将其转换为日期时间。

DY|Dy|dy
星期几的缩写
-对于日期时间到字符串的转换,根据以下内容考虑大小写
示例(模式=>输出):
-DY =太阳
-Dy =太阳
-dy =太阳
-对于从字符串到日期时间的转换,既不涉及模式,也不涉及 Importing
被考虑在内。
-除 IYYY | IYY | IY | I 和 IW 外,不允许将其转换为日期时间。

B.时区令牌

TZH
时区偏移小时(-15 到 15)
-预期 Importing 长度为 3 个字符:符号 1 个字符,值 2 个数字。
例如“ 10”,“ -05”
-接受不带符号的 2 位数字 Importing,例如“ 04”。
-即使不带分隔符,也可以接受 2 位和 3 位数字版本。
-禁用时间戳到字符串和日期到字符串的转换,因为时间戳和日期是时间
zone agnostic.

TZM
时区偏移分钟(0-59)
-对于字符串到日期时间的转换:
-需要 TZH 令牌。
-未签名;标志来自 TZH。
-因此,时区偏移量应表示为“ -30”分钟,例如:input =“-00:30”
pattern="TZH:TZM".
-禁用时间戳到字符串和日期到字符串的转换,因为时间戳和日期是时间
zone agnostic.

C. Separators

-|.|/|,|'|;|:|<space>
Separator
-使用松散匹配。格式中一系列分隔符的存在应与
Importing 中是否存在分隔符序列,而与分隔符的类型或
长度大于 1 的序列的长度。 input =“ 2019-。; 10/10”,pattern =“ YYYY-MM-DD”
已验证;Importing=“ 20191010”,模式=“ YYYY-MM-DD”无效。
-如果分隔符子字符串中的最后一个分隔符为“-”,并且紧随其后
用时区小时(tzh)标记表示,它是一个负号,不算作分隔符,除非
这是分隔符子字符串中唯一可能的分隔符(在这种情况下为
不算作 tzh 的负号)。
-如果整个模式字符串用单引号('')分隔,则撇号分隔符
(')必须以单个反斜杠转义:(')。

D.ISO 8601 定界符

T|Z
ISO 8601 分隔符
-用作分隔符。
-功能是支持“ YYYY-MM-DDTHH24:MI:SS.FF9Z”,“ YYYY-MM-DD-HH24:MI:SSZ”等格式
-对于日期时间到字符串的转换,即使小写(“ t”),输出也始终大写(“ T”)
在模式中提供。
-对于从字符串到日期时间的转换,Importing 和模式的大小写可能会有所不同。

E.嵌套字符串(文本)

–在模式中用双引号(“)引起来。请注意,如果整个模式字符串都已定界
用双引号括起来,然后必须用单反斜杠将双引号转义:(“)。
-为了在嵌套字符串中包含 Literals 双引号字符,请使用 double
引号字符必须使用双反斜杠转义:(\“)。如果整个模式字符串为
用双引号分隔,然后使用三反斜杠转义:(\“)
-如果整个模式字符串都由单引号引起来,则 Literals 单数
嵌套字符串中的引号/撇号(')必须以单个反斜杠转义:(')
-对于从日期时间到字符串的转换,我们只需在输出中包括字符串,即可保留
characters' case.
-对于从字符串到日期时间的转换,信息将丢失,因为嵌套的字符串将不包含在内
日期时间对象的值。但是,嵌套字符串必须与的相关部分匹配
Importing 字符串,除非大小写可能不同。

F.格式修饰符标记

FM
填充模式修改器
-默认为字符串到日期时间的转换。接受比预期少的数字 Importing
如果后跟定界符:
例如格式=“ YYYY-MM-DD”,Importing=“ 19-1-1”,输出= 2019-01-01 00:00:00
-对于日期时间到字符串的转换,填充(文本数据和前导零的尾随空格)
对于数字数据),对于紧接在“ FM”之后的时间元素,则省略
模式字符串。如果后面的元素不是时间元素(例如,如果“ FM”
在分隔符之前),将引发错误。
例如模式= FMHH12:MI:FMSS,Importing= 2019-01-01 01:01:01,输出= 1:01:1
-修改 FX,以便紧随其后的元素接受前导零
模式字符串中的“ FM”。

FX
格式精确修饰符
-默认为日期时间到字符串的转换。数值输出保留为零,并且
非数字输出(除 AM/PM 以外)用正确的空格填充,空格最多达到预期的长度。
-适用于整个模式。
-应用于字符串到日期时间转换的规则:
-分隔符必须完全匹配,直到字符为止。
-数值 Importing 不能省略前导零。此规则不适用于元素(令牌)
紧随其后的是“ FM”。
-AM/PMImporting 长度必须与图案长度匹配。例如模式= AMImporting= AM 不是
接受,但 input = pm 是。