hetu-core/hetu-docs/zh/functions/datetime.md

12 KiB
Raw Permalink Blame History

日期和时间函数和运算符

日期和时间运算符

运算符 示例 结果
+ date '2012-08-08' + interval '2' day 2012-08-10
+ time '01:00' + interval '3' hour 04:00:00.000
+ timestamp '2012-08-08 01:00' + interval '29' hour 2012-08-09 06:00:00.000
+ timestamp '2012-10-31 01:00' + interval '1' month 2012-11-30 01:00:00.000
+ interval '2' day + interval '3' hour 2 03:00:00.000
+ interval '3' year + interval '5' month 3-5
- date '2012-08-08' - interval '2' day 2012-08-06
- time '01:00' - interval '3' hour 22:00:00.000
- timestamp '2012-08-08 01:00' - interval '29' hour 2012-08-06 20:00:00.000
- timestamp '2012-10-31 01:00' - interval '1' month 2012-09-30 01:00:00.000
- interval '2' day - interval '3' hour 1 21:00:00.000
- interval '3' year - interval '5' month 2-7

时区转换

AT TIME ZONE运算符设置时间戳的时区:

SELECT timestamp '2012-10-31 01:00 UTC';
2012-10-31 01:00:00.000 UTC

SELECT timestamp '2012-10-31 01:00 UTC' AT TIME ZONE 'America/Los_Angeles';
2012-10-30 18:00:00.000 America/Los_Angeles

日期和时间函数

current_date -> date

返回查询开始时的当前日期。

current_time -> time with time zone

返回查询开始时的当前时间。

current_timestamp -> timestamp with time zone

返回查询开始时的当前时间戳。

current_timezone() -> varchar

以IANA定义的格式America/Los_Angeles或相对于UTC的固定偏移量+08:35)返回当前时区。

date(x) -> date

这是CAST(x AS date)的别名。

from_iso8601_timestamp(string) -> timestamp with time zone

将以ISO 8601格式表示的string解析为timestamp with time zone

from_iso8601_date(string) -> date

将以ISO 8601格式表示的string解析为date

from_unixtime(unixtime) -> timestamp

将UNIX时间戳unixtime作为时间戳返回。unixtime是从1970-01-01 00:00:00开始经历的秒数。

from_unixtime(unixtime, string) -> timestamp with time zone

将UNIX时间戳unixtime作为timestamp with time zone返回其中使用string作为时区。unixtime是从1970-01-01 00:00:00开始经历的秒数。

from_unixtime(unixtime, hours, minutes) -> timestamp with time zone

将UNIX时间戳unixtime作为timestamp with time zone返回其中使用hoursminutes作为时区偏移量。unixtime是从1970-01-01 00:00:00开始经历的秒数。

localtime -> time

返回查询开始时的当前时间。

localtimestamp -> timestamp

返回查询开始时的当前时间戳。

now() -> timestamp with time zone

这是current_timestamp的别名。

to_iso8601(x) -> varchar

x格式化为ISO 8601字符串。x可以是date、timestamp或timestamp with time zone。

to_milliseconds(interval) -> bigint

以毫秒为单位返回以天和秒为单位的间隔interval

to_unixtime(timestamp) -> double

timestamp作为UNIX时间戳返回。

注意

以下SQL标准函数不使用括号

  • current_date
  • current_time
  • current_timestamp
  • localtime
  • localtimestamp

截断函数

date_trunc函数支持以下单位:

单位 截断值示例
second 2001-08-22 03:04:05.000
minute 2001-08-22 03:04:00.000
hour 2001-08-22 03:00:00.000
day 2001-08-22 00:00:00.000
week 2001-08-20 00:00:00.000
month 2001-08-01 00:00:00.000
quarter 2001-07-01 00:00:00.000
year 2001-01-01 00:00:00.000

上面的示例使用时间戳2001-08-22 03:04:05.321作为输入。

date_trunc(unit, x) -> [与输入相同]

返回x截断至unit后的值。

间隔函数

该部分中的函数支持以下间隔单位:

单位 说明
millisecond 毫秒
second
minute 分钟
hour 小时
day
week
month
quarter 季度
year

date_add(unit, value, timestamp) -> [与输入相同]

timestamp添加类型为unit的间隔value。可以使用负值做减法。

date_diff(unit, timestamp1, timestamp2) -> bigint

unit为单位返回timestamp2 - timestamp1的值。

持续时间函数

parse_duration函数支持以下单位:

单位 说明
ns 纳秒
us 微秒
ms 毫秒
s
m 分钟
h 小时
d

parse_duration(string) -> interval

将格式为value unitstring解析为一个间隔,其中value是以unit为单位的小数值。

SELECT parse_duration('42.8ms'); -- 0 00:00:00.043
SELECT parse_duration('3.81 d'); -- 3 19:26:24.000
SELECT parse_duration('5m');     -- 0 00:05:00.000

MySQL日期函数

该部分中的函数使用与MySQL date_parsestr_to_date函数兼容的格式字符串。下表根据MySQL手册说明了格式说明符

说明符 说明
%a 工作日简称(Sun ... Sat)
%b 月份简称 (Jan ... Dec)
%c 以数字表示的月份 (1 ... 12) [4]
%D 带英文后缀的一个月中的第几日(0th1st2nd3rd、...
%d 以数字表示的一个月中的第几日(01 ... 31) [4]
%e 以数字表示的一个月中的第几日(1 ... 31) [4]
%f 微秒打印6位000000 ... 999000解析19位0 ... 999999999[1]
%H 小时(00 ... 23)
%h 小时(01 ... 12)
%I 小时(01 ... 12)
%i 以数字表示的分钟(00 ... 59)
%j 一年中的某日(001 ... 366)
%k 小时(0 ... 23)
%l 小时(1 ... 12)
%M 月份名称(January ... December)
%m 以数字表示的月份(01 ... 12) [4]
%p AMPM
%r 12小时制时间hh:mm:ss,后跟AMPM
%S 秒(00 ... 59)
%s 秒(00 ... 59)
%T 24小时制时间(hh:mm:ss)
%U 周(00 ... 53),其中星期日为一周中的第一天
%u 周(00 ... 53),其中星期一为一周中的第一天
%V 周(01 ... 53),其中星期日为一周中的第一天;与%X配合使用
%v 周(01 ... 53),其中星期一为一周中的第一天;与%x配合使用
%W 周日名称(Sunday ... Saturday)
%w 星期几(0 ... 6),其中星期日是一周中的第一天 [3]
%X 周所在的年份,其中星期日是一周中的第一天,以四位数字表示,与%V配合使用
%x 周所在的年份,其中星期一是一周中的第一天,以四位数字表示,与%v配合使用
%Y 年份,以四位数字表示
%y 年份,以两位数字表示 [2]
%% %字符
%x x,用于上面未列出的任何x
[1] 时间戳被截断至毫秒。
[2] 在进行解析时,两位数的年份格式采用的范围为19702069因此“70”将产生年份1970但“69”将产生2069
[3] 尚不支持该说明符。考虑使用day_of_week(该函数使用1-7,而不使用0-6)。
[4] ([1], [2], [3], [4]) 该说明符不支持使用0作为月份或日。

警告

当前不支持以下说明符:%D %U %u %V %w %X

date_format(timestamp, format) -> varchar

使用formattimestamp格式化为一个字符串。

date_parse(string, format) -> timestamp

使用formatstring解析为一个时间戳。

Java日期函数

该部分中的函数使用与Joda-Time的DateTimeFormat模式格式兼容的格式字符串。

format_datetime(timestamp, format) -> varchar

使用formattimestamp格式化为一个字符串。

parse_datetime(string, format) -> timestamp with time zone

使用formatstring格式化为一个timestamp with time zone。

提取函数

extract函数支持以下字段:

字段 说明
YEAR year()
QUARTER quarter()
MONTH month()
WEEK week()
DAY day()
DAY_OF_MONTH day()
DAY_OF_WEEK day_of_week()
DOW day_of_week()
DAY_OF_YEAR day_of_year()
DOY day_of_year()
YEAR_OF_WEEK year_of_week()
YOW year_of_week()
HOUR hour()
MINUTE minute()
SECOND second()
TIMEZONE_HOUR timezone_hour()
TIMEZONE_MINUTE timezone_minute()

extract函数支持的类型因要提取的字段而异。大多数字段都支持所有日期和时间类型。

extract(field FROM x) -> bigint

x返回field

注意

该SQL标准函数使用特殊的语法来指定参数。

便捷提取函数

DAY

day(x) -> bigint

x返回一个月中的第几日。

DAY OF MONTH

day_of_month(x) -> bigint

这是day的别名。

DAY OF WEEK

day_of_week(x) -> bigint

x返回星期几(ISO)。值的范围为1(星期一)至7(星期日)。

DAY OF YEAR

day_of_year(x) -> bigint

x返回一年中的第几日。值的范围为1366

DOW

dow(x) -> bigint

这是day_of_week的别名。

DOY

doy(x) -> bigint

这是day_of_year的别名。

HOUR

hour(x) -> bigint

x返回一天中的第几个小时。值的范围为023

MILLISECOND

millisecond(x) -> bigint

x返回一秒中的第几个毫秒。

MINUTE

minute(x) -> bigint

x返回一小时中的第几分钟。

MONTH

month(x) -> bigint

x返回一年中的某个月份。

QUARTER

quarter(x) -> bigint

x返回一年中的某个季度。值的范围为14

SECOND

second(x) -> bigint

x返回一分中的第几秒。

TIMEZONE HOURS

timezone_hour(timestamp) -> bigint

timestamp返回时区偏移量的小时数。

TIMEZONE MINUTE

timezone_minute(timestamp) -> bigint

timestamp返回时区偏移量的分钟数。

WEEK

week(x) -> bigint

x返回一年中的第几周(ISO)。值的范围为153

WEEK OF YEAR

week_of_year(x) -> bigint

这是week的别名。

YEAR

year(x) -> bigint

x返回年份。

YEAR OF WEEK

year_of_week(x) -> bigint

x返回ISO周的年份。

YOW

yow(x) -> bigint

这是year_of_week的别名。