日期/时间模式 (Databricks SQL)

Databricks SQL 中的日期/时间有几种常见使用场景:

模式表

Databricks SQL 使用下表中的模式字母进行日期和时间戳的分析和格式设置:

符号 含义 呈现 示例
G 纪元 文本 AD;公元
y year year 2020;20
D 一年的某一日 数字 (3) 189
M/L 一年的某一月 月份 7;07;七;七月
d 一月的某一日 数字 (3) 28
Q/q 一年的某一季度 数字/文本 3;03;Q3;第三季度
E 星期几 文本 周二;星期二
F 一个月的星期几 数字 (1) 3
a 一天中的上午下午 am-pm PM
h 12 小时制的时钟小时 (1-12) 数字 (2) 12
K 12 小时制的小时 (0-11) 数字 (2) 0
k 24 小时制的时钟小时 (1-24) 数字 (2) 0
H 24 小时制的小时 (0-23) 数字 (2) 0
m 分钟数 数字 (2) 30
s 秒数 数字 (2) 55
S 秒的小数 fraction 978
V 时区 ID 区域 ID America/Los_Angeles; Z; -08:30
z 时区名称 区域名称 太平洋标准时间;PST
O 本地化区域偏移 offset-O GMT+8; GMT+08:00; UTC-08:00;
X 区域偏移“Z”表示零 offset-X Z; -08; -0830; -08:30; -083015; -08:30:15;
x 区域偏移 offset-x +0000; -08; -0830; -08:30; -083015; -08:30:15;
Z 区域偏移 offset-Z +0000; -0800; -08:00;
文本转义 delimiter
‘’ 单引号 文本
[ 可选部分开始
] 可选部分结束

模式字母的计数决定了格式。

  • 文本:文本样式根据使用的模式字母数确定。 如果少于 4 个模式字母,则将使用短文本格式,通常为缩写,例如星期几,Monday 可能输出为“Mon”。 如果刚好有 4 个模式字母,则将使用全文本格式,通常为完整描述,例如星期几,Monday 可能输出为“Monday”。 5 个或更多个字母将会失败。

  • 数字 (n):此处的 n 表示这种类型的日期/时间模式可以使用的最大字母数。 如果字母数为 1,则输出值时使用最小位数且不填充。 除此之外,数字个数用作输出字段的宽度,并根据需要使用零值填充。

  • 数字/文本:如果模式字母数为 3 或更大,请使用上述文本规则。 否则使用上述数字规则。

  • 小数:使用一个或多个(最多 9 个)连续 'S' 字符(例如 SSSSSS)分析并对秒的小数部分进行格式设置。 对于分析,可接受的小数长度可以为 [1,即连续的“S”的数目]。 对于格式设置,小数长度将填充为带零的连续“S”的数目。 Databricks SQL 支持微秒精度的日期/时间,其最多可有 6 位有效数字,但可以解析纳米秒,此时会截断超出位数。

  • 年份:字母数决定了使用填充的最小字段宽度。 如果字母数为 2,则使用减少的两位数字格式。 对于输出,这会输出最右侧的两个数字。 对于分析,这将使用基值 2000 进行分析,得到 2000 到 2099 范围内(含 2000 和 2099)的年份。 如果字母数小于 4(但不是 2),则符号仅输出为负数。 否则,如果在“G”不存在时超出填充宽度,则会输出符号。 7 个或更多个字母将会失败。

  • 月份:它遵循数字/文本的规则。 文本形式取决于字母 - 'M' 表示“标准”形式,'L' 表示“独立”形式。 这两种形式仅在某些语言中是不同的。 例如,在俄语中,“Июль”是七月的独立形式,而“Июля”是标准形式。 下面是所有受支持的模式字母的示例:

    • 'M''L':一年中的月份数从 1 开始。 'M''L' 没有任何区别。 1 到 9 的月份输出时没有填充。

      > SELECT date_format(date '1970-01-01', 'M');
        1
      
      > SELECT date_format(date '1970-12-01', 'L');
        12
      
    • 'MM''LL':一年中的月份数从 1 开始。 将为月份 1-9 添加零填充。

      > SELECT date_format(date '1970-1-01', 'LL');
        01
      
      > SELECT date_format(date '1970-09-01', 'MM');
        09
      
    • 'MMM':标准形式的短文本表示形式。 月份模式应该是日期模式的一部分,而不只是一个独立的月份,但区域设置除外,在区域设置中,标准形式和独立形式之间没有区别(如英语)。

      > SELECT date_format(date '1970-01-01', 'd MMM');
        1 Jan
      
      -- Passing a format pattern to to_csv()
      > SELECT to_csv(named_struct('date', date '1970-01-01'), map('dateFormat', 'dd MMM', 'locale', 'RU'));
        01 янв.
      
    • 'MMMM':标准形式的完整文本月份表示形式。 它用于将月份分析/格式设置为日期/时间戳的一部分。

      > SELECT date_format(date '1970-01-01', 'd MMMM');
        1 January
      
      -- Passing a format pttern to to_csv()
      > SELECT to_csv(named_struct('date', date '1970-01-01'), map('dateFormat', 'd MMMM', 'locale', 'RU'));
        1 января
      
  • am-pm:这会输出一天中的上午下午。 模式字母数必须为 1。

  • 区域 ID(V):这将输出显示时区 ID。 模式字母数必须为 2。

  • 区域名称(z):这将输出时区 ID 的显示文本名称。 如果字母计为 1、2 或 3,则输出短名称。 如果字母计为 4,则输出全名。 5 个或更多个字母将失败。

  • 偏移 X 和 x:这会根据模式字母的数量设置偏移的格式。 1 个字母仅输出小时,如“+01”,除非分钟不为零,在这种情况下,也会输出分钟,如“+0130”。 2 个字母将输出小时和分钟,不带冒号,如“+0130”。 3 个字母将输出小时和分钟,带冒号,如“+01:30”。 4 个字母将输出小时、分钟以及可选的秒,不带冒号,如“+013015”。 5 个字母将输出小时、分钟以及可选的秒,带冒号,如“+01:30:15”。 6 个或更多个字母将会失败。 当要输出的偏移量为零时,模式字母“X”(大写)将输出“Z”,而模式字母“x”(小写)将输出“+00”、“+0000”或“+00:00”。

  • 偏移 O:这会根据模式字母的数量设置本地化偏移的格式。 1 个字母将输出本地化偏移的短格式,即本地化偏移文本(如“GMT”),包含没有前导零的小时、可选的 2 位数分钟和秒(如果不为零),带冒号,如“GMT+8”。 4 个字母将输出完整格式,即本地化偏移文本,如“GMT”,其中包含 2 位数的小时和分钟字段,可选的秒字段(如果不为零),带冒号,如“GMT+08:00”。 任何其他字母数都将失败。

  • 偏移 Z:这会根据模式字母的数量设置偏移的格式。 1、2 或 3 个字母将输出小时和分钟,不带冒号,如“+0130”。 偏移量为零时,输出为“+0000”。 4 个字母将输出本地化偏移,等效于 4 个字母的Offset-O。 如果偏移量为零,则输出为相应的本地化偏移文本。 5 个字母将输出小时、分钟和可选的秒(如果不为零),带冒号。 如果偏移量为零,则输出“Z”。 6 个或更多个字母将会失败。

  • 可选部分的开始和结束:使用 [] 定义可选部分,可能是嵌套的。 在设置格式的过程中,即使所有有效数据都处于可选部分,也会输出。 在分析过程中,已分析字符串中可能会缺少整个部分。 可选部分以 [ 开头,并使用 ] 结尾(或在模式末尾)。

  • 符号“E”、“F”、“q”和“Q”只能用于日期/时间格式设置,例如 date_format。 它们不能用于日期时间分析,例如 to_timestamp