日期和時間函數與運算子

日期和時間運算子

運算子

範例

結果

+

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) 的別名。

last_day_of_month(x) -> 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 作為時間戳記回傳。

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

將 UNIX 時間戳記 unixtime 作為帶時區的時間戳記回傳,並使用 string 作為時區。

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

將 UNIX 時間戳記 unixtime 作為帶時區的時間戳記回傳,並使用 hoursminutes 作為時區偏移量。

localtime -> time()

傳回查詢開始時的目前時間。

localtimestamp -> timestamp()

傳回查詢開始時的目前時間戳記。

now() -> timestamp with time zone()

這是 current_timestamp 的別名。

to_iso8601(x) -> varchar()

x 格式化為 ISO 8601 字串。x 可以是日期、時間戳記或帶時區的時間戳記。

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) -> [same as input]()

回傳截斷為 unitx

間隔函式

此區段中的函式支援以下間隔單位

單位

描述

millisecond

毫秒

second

minute

分鐘

hour

小時

day

week

month

quarter

一年中的季度

year

date_add(unit, value, timestamp) -> [same as input]()

unit 類型的間隔 value 加到 timestamp。可以使用負值執行減法。

date_diff(unit, timestamp1, timestamp2) -> bigint()

unit 表示,回傳 timestamp2 - timestamp1 的差值。

持續時間函式

parse_duration 函式支援以下單位

單位

描述

ns

奈秒

us

微秒

ms

毫秒

s

m

分鐘

h

小時

d

parse_duration(string) -> interval()

將格式為 value unitstring 解析為間隔,其中 valueunit 值的非整數數值。

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

帶有英文後綴的月份日期 (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

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

警告

目前不支援以下指定符:%D %U %u %V %w %X

date_format(timestamp, format) -> varchar()

使用 formattimestamp 格式化為字串。

date_parse(string, format) -> timestamp()

使用 formatstring 解析為時間戳記。

Java 日期函數

本節中的函數使用與 JodaTime 的 DateTimeFormat 模式格式相容的格式字串。

format_datetime(timestamp, format) -> varchar()

使用 formattimestamp 格式化為字串。

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

使用 formatstring 解析為帶時區的時間戳記。

提取函數

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(x) -> bigint()

x 傳回月份中的日期。

day_of_month(x) -> bigint()

這是 day() 的別名。

day_of_week(x) -> bigint()

x 傳回 ISO 週中的日期。值範圍從 1 (星期一) 到 7 (星期日)。

day_of_year(x) -> bigint()

x 傳回一年中的日期。值範圍從 1366

dow(x) -> bigint()

這是 day_of_week() 的別名。

doy(x) -> bigint()

這是 day_of_year() 的別名。

hour(x) -> bigint()

x 傳回一天中的小時。值範圍從 023

millisecond(x) -> bigint()

x 傳回秒的毫秒數。

minute(x) -> bigint()

x 傳回小時中的分鐘數。

month(x) -> bigint()

x 傳回一年中的月份。

quarter(x) -> bigint()

x 傳回一年中的季度。值範圍從 14

second(x) -> bigint()

x 傳回分鐘中的秒數。

timezone_hour(timestamp) -> bigint()

timestamp 傳回時區偏移的小時數。

timezone_minute(timestamp) -> bigint()

timestamp 傳回時區偏移的分鐘數。

week(x) -> bigint()

x 傳回一年中的 ISO 週。值範圍從 153

week_of_year(x) -> bigint()

這是 week() 的別名。

year(x) -> bigint()

x 傳回年份。

year_of_week(x) -> bigint()

x 傳回 ISO 週的年份。

yow(x) -> bigint()

這是 year_of_week() 的別名。