12 KiB
日期和时间函数和运算符
日期和时间运算符
运算符 | 示例 | 结果 |
---|---|---|
+ |
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返回,其中使用hours
和minutes
作为时区偏移量。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 unit
的string
解析为一个间隔,其中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_parse
和str_to_date
函数兼容的格式字符串。下表根据MySQL手册说明了格式说明符:
说明符 | 说明 |
---|---|
%a |
工作日简称(Sun ... Sat ) |
%b |
月份简称 (Jan ... Dec ) |
%c |
以数字表示的月份 (1 ... 12 ) [4] |
%D |
带英文后缀的一个月中的第几日(0th 、1st 、2nd 、3rd 、...) |
%d |
以数字表示的一个月中的第几日(01 ... 31 ) [4] |
%e |
以数字表示的一个月中的第几日(1 ... 31 ) [4] |
%f |
微秒(打印6位:000000 ... 999000 ;解析1–9位: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 |
AM 或PM |
%r |
12小时制时间(hh:mm:ss ,后跟AM 或PM ) |
%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] | 在进行解析时,两位数的年份格式采用的范围为1970 至2069 ,因此“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
使用format
将timestamp
格式化为一个字符串。
date_parse(string, format) -> timestamp
使用format
将string
解析为一个时间戳。
Java日期函数
该部分中的函数使用与Joda-Time的DateTimeFormat模式格式兼容的格式字符串。
format_datetime(timestamp, format) -> varchar
使用format
将timestamp
格式化为一个字符串。
parse_datetime(string, format) -> timestamp with time zone
使用format
将string
格式化为一个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
返回一年中的第几日。值的范围为1
至366
。
DOW
dow(x) -> bigint
这是day_of_week
的别名。
DOY
doy(x) -> bigint
这是day_of_year
的别名。
HOUR
hour(x) -> bigint
从x
返回一天中的第几个小时。值的范围为0
至23
。
MILLISECOND
millisecond(x) -> bigint
从x
返回一秒中的第几个毫秒。
MINUTE
minute(x) -> bigint
从x
返回一小时中的第几分钟。
MONTH
month(x) -> bigint
从x
返回一年中的某个月份。
QUARTER
quarter(x) -> bigint
从x
返回一年中的某个季度。值的范围为1
至4
。
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)。值的范围为1
至53
。
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
的别名。