日期和时间函数和运算符

日期和时间运算符

运算符示例结果
+date ‘2012-08-08’ + interval ‘2’ day2012-08-10
+time ‘01:00’ + interval ‘3’ hour04:00:00.000
+timestamp ‘2012-08-08 01:00’ + interval ‘29’ hour2012-08-09 06:00:00.000
+timestamp ‘2012-10-31 01:00’ + interval ‘1’ month2012-11-30 01:00:00.000
+interval ‘2’ day + interval ‘3’ hour2 03:00:00.000
+interval ‘3’ year + interval ‘5’ month3-5
-date ‘2012-08-08’ - interval ‘2’ day2012-08-06
-time ‘01:00’ - interval ‘3’ hour22:00:00.000
-timestamp ‘2012-08-08 01:00’ - interval ‘29’ hour2012-08-06 20:00:00.000
-timestamp ‘2012-10-31 01:00’ - interval ‘1’ month2012-09-30 01:00:00.000
-interval ‘2’ day - interval ‘3’ hour1 21:00:00.000
-interval ‘3’ year - interval ‘5’ month2-7

时区转换

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

  1. SELECT timestamp '2012-10-31 01:00 UTC';
  2. 2012-10-31 01:00:00.000 UTC
  3. SELECT timestamp '2012-10-31 01:00 UTC' AT TIME ZONE 'America/Los_Angeles';
  4. 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函数支持以下单位:

单位截断值示例
second2001-08-22 03:04:05.000
minute2001-08-22 03:04:00.000
hour2001-08-22 03:00:00.000
day2001-08-22 00:00:00.000
week2001-08-20 00:00:00.000
month2001-08-01 00:00:00.000
quarter2001-07-01 00:00:00.000
year2001-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为单位的小数值。

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

MySQL日期函数

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

说明符说明
%a工作日简称(SunSat)
%b月份简称 (JanDec)
%c以数字表示的月份 (112) [4]
%D带英文后缀的一个月中的第几日(0th1st2nd3rd、…)
%d以数字表示的一个月中的第几日(0131) [4]
%e以数字表示的一个月中的第几日(131) [4]
%f微秒(打印6位:000000999000;解析1–9位:0999999999)[1]
%H小时(0023)
%h小时(0112)
%I小时(0112)
%i以数字表示的分钟(0059)
%j一年中的某日(001366)
%k小时(023)
%l小时(112)
%M月份名称(JanuaryDecember)
%m以数字表示的月份(0112) [4]
%pAMPM
%r12小时制时间(hh:mm:ss,后跟AMPM
%S秒(0059)
%s秒(0059)
%T24小时制时间(hh:mm:ss)
%U周(0053),其中星期日为一周中的第一天
%u周(0053),其中星期一为一周中的第一天
%V周(0153),其中星期日为一周中的第一天;与%X配合使用
%v周(0153),其中星期一为一周中的第一天;与%x配合使用
%W周日名称(SundaySaturday)
%w星期几(06),其中星期日是一周中的第一天 [3]
%X周所在的年份,其中星期日是一周中的第一天,以四位数字表示,与%V配合使用
%x周所在的年份,其中星期一是一周中的第一天,以四位数字表示,与%v配合使用
%Y年份,以四位数字表示
%y年份,以两位数字表示 [2]
%%%字符
%xx,用于上面未列出的任何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函数支持以下字段:

字段说明
YEARyear()
QUARTERquarter()
MONTHmonth()
WEEKweek()
DAYday()
DAY_OF_MONTHday()
DAY_OF_WEEKday_of_week()
DOWday_of_week()
DAY_OF_YEARday_of_year()
DOYday_of_year()
YEAR_OF_WEEKyear_of_week()
YOWyear_of_week()
HOURhour()
MINUTEminute()
SECONDsecond()
TIMEZONE_HOURtimezone_hour()
TIMEZONE_MINUTEtimezone_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的别名。