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_datecurrent_timecurrent_timestamplocaltimelocaltimestamp
截断函数
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的别名。