日期/时间和间隔函数和运算符
Elastic Stack Serverless
Elasticsearch SQL 提供了用于执行日期/时间操作的各种功能。
在处理日期/时间时,一个常见的需求通常围绕interval
(间隔)的概念,这是一个值得在 Elasticsearch 和 Elasticsearch SQL 上下文中探讨的主题。
Elasticsearch 对 日期数学 提供全面支持,无论是在 索引名称 内部还是在 查询 内部。在 Elasticsearch SQL 内部,前者通过在表名中传递表达式来支持,而后者通过标准 SQL INTERVAL
来支持。
下表显示了 Elasticsearch 和 Elasticsearch SQL 之间的映射
Elasticsearch | Elasticsearch SQL |
---|---|
索引/表 日期时间数学 | |
<index-{now/M{YYYY.MM}}> |
|
查询日期/时间数学 | |
1y |
INTERVAL 1 YEAR |
2M |
INTERVAL 2 MONTH |
3w |
INTERVAL 21 DAY |
4d |
INTERVAL 4 DAY |
5h |
INTERVAL 5 HOUR |
6m |
INTERVAL 6 MINUTE |
7s |
INTERVAL 7 SECOND |
INTERVAL
允许 YEAR
和 MONTH
混合在一起,*或者* DAY
、HOUR
、MINUTE
和 SECOND
。
Elasticsearch SQL 也接受每个时间单位的复数形式(例如,YEAR
和 YEARS
都是有效的)。
下面是可能组合的示例
间隔 | 描述 |
---|---|
INTERVAL '1-2' YEAR TO MONTH |
1 年 2 个月 |
INTERVAL '3 4' DAYS TO HOURS |
3 天 4 小时 |
INTERVAL '5 6:12' DAYS TO MINUTES |
5 天 6 小时 12 分钟 |
INTERVAL '3 4:56:01' DAY TO SECOND |
3 天 4 小时 56 分钟 1 秒 |
INTERVAL '2 3:45:01.23456789' DAY TO SECOND |
2 天 3 小时 45 分钟 1 秒 234567890 纳秒 |
INTERVAL '123:45' HOUR TO MINUTES |
123 小时 45 分钟 |
INTERVAL '65:43:21.0123' HOUR TO SECONDS |
65 小时 43 分钟 21 秒 12300000 纳秒 |
INTERVAL '45:01.23' MINUTES TO SECONDS |
45 分钟 1 秒 230000000 纳秒 |
可以将日期/时间字段与 日期数学 表达式使用等式 (=
) 和 IN
运算符进行比较
SELECT hire_date FROM emp WHERE hire_date = '1987-03-01||+4y/y';
hire_date
------------------------
1991-01-26T00:00:00.000Z
1991-10-22T00:00:00.000Z
1991-09-01T00:00:00.000Z
1991-06-26T00:00:00.000Z
1991-08-30T00:00:00.000Z
1991-12-01T00:00:00.000Z
SELECT hire_date FROM emp WHERE hire_date IN ('1987-03-01||+2y/M', '1987-03-01||+3y/M');
hire_date
------------------------
1989-03-31T00:00:00.000Z
1990-03-02T00:00:00.000Z
基本的算术运算符(+
、-
、*
)支持如下所示的日期/时间参数
SELECT INTERVAL 1 DAY + INTERVAL 53 MINUTES AS result;
result
---------------
+1 00:53:00
SELECT CAST('1969-05-13T12:34:56' AS DATETIME) + INTERVAL 49 YEARS AS result;
result
--------------------
2018-05-13T12:34:56Z
SELECT - INTERVAL '49-1' YEAR TO MONTH result;
result
---------------
-49-1
SELECT INTERVAL '1' DAY - INTERVAL '2' HOURS AS result;
result
---------------
+0 22:00:00
SELECT CAST('2018-05-13T12:34:56' AS DATETIME) - INTERVAL '2-8' YEAR TO MONTH AS result;
result
--------------------
2015-09-13T12:34:56Z
SELECT -2 * INTERVAL '3' YEARS AS result;
result
---------------
-6-0
以日期/时间为目标的函数。
CURRENT_DATE
CURRENT_DATE()
CURDATE()
输入:无
输出:日期
描述:返回当前查询到达服务器时的日期(无时间部分)。它可以作为关键字使用:CURRENT_DATE
或作为没有参数的函数:CURRENT_DATE()
。
与 CURRENT_DATE 不同,CURDATE()
只能作为没有参数的函数使用,而不能作为关键字使用。
对于同一查询中的每次出现,此方法总是返回相同的值。
SELECT CURRENT_DATE AS result;
result
------------------------
2018-12-12
SELECT CURRENT_DATE() AS result;
result
------------------------
2018-12-12
SELECT CURDATE() AS result;
result
------------------------
2018-12-12
通常,此函数(以及其孪生 TODAY() 函数)用于相对日期筛选
SELECT first_name FROM emp WHERE hire_date > TODAY() - INTERVAL 35 YEARS ORDER BY first_name ASC LIMIT 5;
first_name
------------
Alejandro
Amabile
Anoosh
Basil
Brendon
CURRENT_TIME
CURRENT_TIME([precision])
CURTIME
输入:
- 小数位数;可选
输出:时间
描述:返回当前查询到达服务器时的时间。作为函数,CURRENT_TIME()
接受 precision 作为可选参数,用于舍入秒的小数位数(纳秒)。默认的 precision 为 3,表示将返回毫秒精度的时间。
对于同一查询中的每次出现,此方法总是返回相同的值。
SELECT CURRENT_TIME AS result;
result
------------------------
12:31:27.237Z
SELECT CURRENT_TIME() AS result;
result
------------------------
12:31:27.237Z
SELECT CURTIME() AS result;
result
------------------------
12:31:27.237Z
SELECT CURRENT_TIME(1) AS result;
result
------------------------
12:31:27.2Z
通常,此函数用于相对日期/时间筛选
SELECT first_name FROM emp WHERE CAST(hire_date AS TIME) > CURRENT_TIME() - INTERVAL 20 MINUTES ORDER BY first_name ASC LIMIT 5;
first_name
---------------
Alejandro
Amabile
Anneke
Anoosh
Arumugam
目前,使用大于 6 的 precision 对函数的输出没有任何影响,因为返回的秒的小数位数的最大数量为 6。
CURRENT_TIMESTAMP
CURRENT_TIMESTAMP([precision])
输入:
- 小数位数;可选
输出:日期/时间
描述:返回当前查询到达服务器时的日期/时间。作为函数,CURRENT_TIMESTAMP()
接受 precision 作为可选参数,用于舍入秒的小数位数(纳秒)。默认的 precision 为 3,表示将返回毫秒精度的当前日期/时间。
对于同一查询中的每次出现,此方法总是返回相同的值。
SELECT CURRENT_TIMESTAMP AS result;
result
------------------------
2018-12-12T14:48:52.448Z
SELECT CURRENT_TIMESTAMP() AS result;
result
------------------------
2018-12-12T14:48:52.448Z
SELECT CURRENT_TIMESTAMP(1) AS result;
result
------------------------
2018-12-12T14:48:52.4Z
通常,此函数(以及其孪生 NOW() 函数)用于相对日期/时间筛选
SELECT first_name FROM emp WHERE hire_date > NOW() - INTERVAL 100 YEARS ORDER BY first_name ASC LIMIT 5;
first_name
---------------
Alejandro
Amabile
Anneke
Anoosh
Arumugam
目前,使用大于 6 的 precision 对函数的输出没有任何影响,因为返回的秒的小数位数的最大数量为 6。
DATE_ADD(
string_exp,
integer_exp,
datetime_exp)
输入:
- 字符串表达式,表示要添加到日期/时间的日期/时间单位。如果
null
,则函数返回null
。 - 整数表达式,表示应将上述单位添加/从日期/时间中减去多少次,如果使用负值,则会导致从日期/时间中减去。如果
null
,则函数返回null
。 - 日期/时间表达式。如果
null
,则函数返回null
。
输出:日期时间
描述:将给定的日期/时间单位数添加到日期/时间。如果单位数为负数,则从日期/时间中减去。
如果第二个参数是 long,则存在截断的可能性,因为将从该 long 中提取并使用一个整数值。
要添加/减去的日期时间单位 | |
---|---|
单位 | 缩写 |
年 | 年, yy, yyyy |
季度 | 季度, qq, q |
月 | 月, mm, m |
一年中的第几天 | dy, y |
日 | 日, dd, d |
周 | 周, wk, ww |
工作日 | 工作日, dw |
小时 | 小时, hh |
分钟 | 分钟, mi, n |
秒 | 秒, ss, s |
毫秒 | 毫秒, ms |
微秒 | 微秒, mcs |
纳秒 | 纳秒, ns |
SELECT DATE_ADD('years', 10, '2019-09-04T11:22:33.000Z'::datetime) AS "+10 years";
+10 years
------------------------
2029-09-04T11:22:33.000Z
SELECT DATE_ADD('week', 10, '2019-09-04T11:22:33.000Z'::datetime) AS "+10 weeks";
+10 weeks
------------------------
2019-11-13T11:22:33.000Z
SELECT DATE_ADD('seconds', -1234, '2019-09-04T11:22:33.000Z'::datetime) AS "-1234 seconds";
-1234 seconds
------------------------
2019-09-04T11:01:59.000Z
SELECT DATE_ADD('qq', -417, '2019-09-04'::date) AS "-417 quarters";
-417 quarters
------------------------
1915-06-04T00:00:00.000Z
SELECT DATE_ADD('minutes', 9235, '2019-09-04'::date) AS "+9235 minutes";
+9235 minutes
------------------------
2019-09-10T09:55:00.000Z
DATE_DIFF(
string_exp,
datetime_exp,
datetime_exp)
输入:
- 字符串表达式,表示以下两个日期/时间表达式之间的日期/时间单位差。如果
null
,则函数返回null
。 - 开始日期/时间表达式。如果
null
,则函数返回null
。 - 结束日期/时间表达式。如果
null
,则函数返回null
。
输出:整数
描述:从第三个参数中减去第二个参数,并返回它们之间以第一个参数中指定的单位的倍数表示的差。如果第二个参数(开始)大于第三个参数(结束),则返回负值。
日期时间差单位 | |
---|---|
单位 | 缩写 |
年 | 年, yy, yyyy |
季度 | 季度, qq, q |
月 | 月, mm, m |
一年中的第几天 | dy, y |
日 | 日, dd, d |
周 | 周, wk, ww |
工作日 | 工作日, dw |
小时 | 小时, hh |
分钟 | 分钟, mi, n |
秒 | 秒, ss, s |
毫秒 | 毫秒, ms |
微秒 | 微秒, mcs |
纳秒 | 纳秒, ns |
SELECT DATE_DIFF('years', '2019-09-04T11:22:33.000Z'::datetime, '2032-09-04T22:33:11.000Z'::datetime) AS "diffInYears";
diffInYears
------------------------
13
SELECT DATE_DIFF('week', '2019-09-04T11:22:33.000Z'::datetime, '2016-12-08T22:33:11.000Z'::datetime) AS "diffInWeeks";
diffInWeeks
------------------------
-143
SELECT DATE_DIFF('seconds', '2019-09-04T11:22:33.123Z'::datetime, '2019-07-12T22:33:11.321Z'::datetime) AS "diffInSeconds";
diffInSeconds
------------------------
-4625362
SELECT DATE_DIFF('qq', '2019-09-04'::date, '2025-04-25'::date) AS "diffInQuarters";
diffInQuarters
------------------------
23
对于 hour
和 minute
,DATEDIFF
不进行任何舍入,而是首先将 2 个日期上更详细的时间字段截断为零,然后计算减法。
SELECT DATEDIFF('hours', '2019-11-10T12:10:00.000Z'::datetime, '2019-11-10T23:59:59.999Z'::datetime) AS "diffInHours";
diffInHours
------------------------
11
SELECT DATEDIFF('minute', '2019-11-10T12:10:00.000Z'::datetime, '2019-11-10T12:15:59.999Z'::datetime) AS "diffInMinutes";
diffInMinutes
------------------------
5
SELECT DATE_DIFF('minutes', '2019-09-04'::date, '2015-08-17T22:33:11.567Z'::datetime) AS "diffInMinutes";
diffInMinutes
------------------------
-2128407
DATE_FORMAT(
date_exp/datetime_exp/time_exp,
string_exp)
输入:
- 日期/时间/时间表达式。如果
null
,则函数返回null
。 - 格式模式。如果
null
或空字符串,则函数返回null
。
输出:字符串
描述:使用第二个参数中指定的格式将日期/时间/时间作为字符串返回。格式化模式是 MySQL DATE_FORMAT() 函数 中使用的说明符之一。
如果第一个参数的类型为 time
,则由第二个参数指定的模式不能包含与日期相关的单位(例如,dd、MM、yyyy 等)。如果它包含此类单位,则会返回一个错误。月份和日期说明符(%c、%D、%d、%e、%m)的范围从一开始,不像 MySQL 那样从零开始,这是因为 MySQL 允许存储不完整的日期,例如 2014-00-00。 在这种情况下,Elasticsearch 会返回一个错误。
SELECT DATE_FORMAT(CAST('2020-04-05' AS DATE), '%d/%m/%Y') AS "date";
date
------------------
05/04/2020
SELECT DATE_FORMAT(CAST('2020-04-05T11:22:33.987654' AS DATETIME), '%d/%m/%Y %H:%i:%s.%f') AS "datetime";
datetime
------------------
05/04/2020 11:22:33.987654
SELECT DATE_FORMAT(CAST('23:22:33.987' AS TIME), '%H %i %s.%f') AS "time";
time
------------------
23 22 33.987000
DATE_PARSE(
string_exp,
string_exp)
输入:
- 作为字符串的日期表达式。如果
null
或空字符串,则函数返回null
。 - 解析模式。如果
null
或空字符串,则函数返回null
。
输出:日期
描述:通过使用第二个参数中指定的格式解析第一个参数来返回日期。使用的解析格式模式来自 java.time.format.DateTimeFormatter
。
如果解析模式不包含所有有效的日期单位(例如 HH:mm:ss、dd-MM HH:mm:ss 等),则会返回一个错误,因为该函数需要返回一个 date
类型的值,该类型将包含日期部分。
SELECT DATE_PARSE('07/04/2020', 'dd/MM/yyyy') AS "date";
date
-----------
2020-04-07
DATETIME_FORMAT(
date_exp/datetime_exp/time_exp,
string_exp)
输入:
- 日期/时间/时间表达式。如果
null
,则函数返回null
。 - 格式模式。如果
null
或空字符串,则函数返回null
。
输出:字符串
描述:使用第二个参数中指定的格式将日期/时间/时间作为字符串返回。使用的格式化模式来自 java.time.format.DateTimeFormatter
。
如果第一个参数的类型为 time
,则由第二个参数指定的模式不能包含与日期相关的单位(例如,dd、MM、yyyy 等)。如果它包含此类单位,则会返回一个错误。
SELECT DATETIME_FORMAT(CAST('2020-04-05' AS DATE), 'dd/MM/yyyy') AS "date";
date
------------------
05/04/2020
SELECT DATETIME_FORMAT(CAST('2020-04-05T11:22:33.987654' AS DATETIME), 'dd/MM/yyyy HH:mm:ss.SS') AS "datetime";
datetime
------------------
05/04/2020 11:22:33.98
SELECT DATETIME_FORMAT(CAST('11:22:33.987' AS TIME), 'HH mm ss.S') AS "time";
time
------------------
11 22 33.9
DATETIME_PARSE(
string_exp,
string_exp)
输入:
- 作为字符串的日期时间表达式。如果
null
或空字符串,则函数返回null
。 - 解析模式。如果
null
或空字符串,则函数返回null
。
输出:日期时间
描述:通过使用第二个参数中指定的格式解析第一个参数来返回日期时间。使用的解析格式模式来自 java.time.format.DateTimeFormatter
。
如果解析模式仅包含日期或仅包含时间单位(例如 dd/MM/yyyy、HH:mm:ss 等),则会返回一个错误,因为该函数需要返回一个 datetime
类型的值,该类型必须同时包含日期和时间。
SELECT DATETIME_PARSE('07/04/2020 10:20:30.123', 'dd/MM/yyyy HH:mm:ss.SSS') AS "datetime";
datetime
------------------------
2020-04-07T10:20:30.123Z
SELECT DATETIME_PARSE('10:20:30 07/04/2020 Europe/Berlin', 'HH:mm:ss dd/MM/yyyy VV') AS "datetime";
datetime
------------------------
2020-04-07T08:20:30.000Z
TIME_PARSE(
string_exp,
string_exp)
输入:
- 作为字符串的时间表达式。如果为
null
或空字符串,则该函数返回null
。 - 解析模式。如果
null
或空字符串,则函数返回null
。
输出:时间
描述:通过使用第二个参数中指定的格式解析第一个参数,返回一个时间。使用的解析格式模式来自 java.time.format.DateTimeFormatter
。
如果解析模式仅包含日期单位(例如,dd/MM/yyyy),则会返回错误,因为该函数需要返回 time
类型的值,该值将仅包含时间。
SELECT TIME_PARSE('10:20:30.123', 'HH:mm:ss.SSS') AS "time";
time
---------------
10:20:30.123Z
SELECT TIME_PARSE('10:20:30-01:00', 'HH:mm:ssXXX') AS "time";
time
---------------
11:20:30.000Z
DATE_PART(
string_exp,
datetime_exp)
输入:
- 表示要从日期/日期时间中提取的单位的字符串表达式。如果为
null
,则该函数返回null
。 - 日期/时间表达式。如果
null
,则函数返回null
。
输出:整数
描述:从日期/日期时间中提取指定的单位。它类似于 EXTRACT
,但单位的名称和别名不同,并提供更多选项(例如:TZOFFSET
)。
要提取的日期时间单位 | |
---|---|
单位 | 缩写 |
年 | 年, yy, yyyy |
季度 | 季度, qq, q |
月 | 月, mm, m |
一年中的第几天 | dy, y |
日 | 日, dd, d |
周 | 周, wk, ww |
工作日 | 工作日, dw |
小时 | 小时, hh |
分钟 | 分钟, mi, n |
秒 | 秒, ss, s |
毫秒 | 毫秒, ms |
微秒 | 微秒, mcs |
纳秒 | 纳秒, ns |
tzoffset | tz |
SELECT DATE_PART('year', '2019-09-22T11:22:33.123Z'::datetime) AS "years";
years
----------
2019
SELECT DATE_PART('mi', '2019-09-04T11:22:33.123Z'::datetime) AS mins;
mins
-----------
22
SELECT DATE_PART('quarters', CAST('2019-09-24' AS DATE)) AS quarter;
quarter
-------------
3
SELECT DATE_PART('month', CAST('2019-09-24' AS DATE)) AS month;
month
-------------
9
对于 week
和 weekday
,单位是使用非 ISO 计算提取的,这意味着给定的星期被认为是从星期日开始,而不是星期一。
SELECT DATE_PART('week', '2019-09-22T11:22:33.123Z'::datetime) AS week;
week
----------
39
tzoffset
返回表示时区偏移的总分钟数(带符号)。
SELECT DATE_PART('tzoffset', '2019-09-04T11:22:33.123+05:15'::datetime) AS tz_mins;
tz_mins
--------------
315
SELECT DATE_PART('tzoffset', '2019-09-04T11:22:33.123-03:49'::datetime) AS tz_mins;
tz_mins
--------------
-229
DATE_TRUNC(
string_exp,
datetime_exp/interval_exp)
输入:
- 表示日期/日期时间/间隔应截断到的单位的字符串表达式。如果为
null
,则该函数返回null
。 - 日期/日期时间/间隔表达式。如果为
null
,则该函数返回null
。
输出:日期时间/间隔
描述:将日期/日期时间/间隔截断到指定的单位,方法是将所有重要性低于指定单位的字段设置为零(对于日、星期几和月,则设置为一)。如果第一个参数是 week
并且第二个参数的类型是 interval
,则会抛出一个错误,因为 interval
数据类型不支持 week
时间单位。
日期时间截断单位 | |
---|---|
单位 | 缩写 |
millennium | millennia |
century | centuries |
decade | decades |
年 | 年, yy, yyyy |
季度 | 季度, qq, q |
月 | 月, mm, m |
周 | 周, wk, ww |
日 | 日, dd, d |
小时 | 小时, hh |
分钟 | 分钟, mi, n |
秒 | 秒, ss, s |
毫秒 | 毫秒, ms |
微秒 | 微秒, mcs |
纳秒 | 纳秒, ns |
SELECT DATE_TRUNC('millennium', '2019-09-04T11:22:33.123Z'::datetime) AS millennium;
millennium
------------------------
2000-01-01T00:00:00.000Z
SELECT DATETRUNC('week', '2019-08-24T11:22:33.123Z'::datetime) AS week;
week
------------------------
2019-08-19T00:00:00.000Z
SELECT DATE_TRUNC('mi', '2019-09-04T11:22:33.123Z'::datetime) AS mins;
mins
------------------------
2019-09-04T11:22:00.000Z
SELECT DATE_TRUNC('decade', CAST('2019-09-04' AS DATE)) AS decades;
decades
------------------------
2010-01-01T00:00:00.000Z
SELECT DATETRUNC('quarters', CAST('2019-09-04' AS DATE)) AS quarter;
quarter
------------------------
2019-07-01T00:00:00.000Z
SELECT DATE_TRUNC('centuries', INTERVAL '199-5' YEAR TO MONTH) AS centuries;
centuries
------------------
+100-0
SELECT DATE_TRUNC('hours', INTERVAL '17 22:13:12' DAY TO SECONDS) AS hour;
hour
------------------
+17 22:00:00
SELECT DATE_TRUNC('days', INTERVAL '19 15:24:19' DAY TO SECONDS) AS day;
day
------------------
+19 00:00:00
FORMAT(
date_exp/datetime_exp/time_exp,
string_exp)
输入:
- 日期/时间/时间表达式。如果
null
,则函数返回null
。 - 格式模式。如果
null
或空字符串,则函数返回null
。
输出:字符串
描述:使用第二个参数中指定的 格式 将日期/日期时间/时间返回为字符串。使用的格式化模式来自 Microsoft SQL Server 格式规范。
如果第一个参数的类型为 time
,则由第二个参数指定的模式不能包含与日期相关的单位(例如,dd、MM、yyyy 等)。如果它包含此类单位,则会返回一个错误。
格式说明符 F
的工作方式与格式说明符 f
类似。 它将返回秒的小数部分,并且位数将与作为输入提供的 F
的数量相同(最多 9 位)。结果将在末尾附加 0
以匹配提供的 F
的数量。例如:对于时间部分 10:20:30.1234
和模式 HH:mm:ss.FFFFFF
,该函数的输出字符串将为:10:20:30.123400
。
格式说明符 y
将返回时代年,而不是一个/两个低位数字。例如:对于年份 2009
,y
将返回 2009
而不是 9
。对于年份 43
,y
格式说明符将返回 43
。 - 诸如 "
、 \
和 %
之类的特殊字符将按原样返回,没有任何更改。例如:使用 %M
格式化日期 17-sep-2020
将返回 %9
SELECT FORMAT(CAST('2020-04-05' AS DATE), 'dd/MM/yyyy') AS "date";
date
------------------
05/04/2020
SELECT FORMAT(CAST('2020-04-05T11:22:33.987654' AS DATETIME), 'dd/MM/yyyy HH:mm:ss.ff') AS "datetime";
datetime
------------------
05/04/2020 11:22:33.98
SELECT FORMAT(CAST('11:22:33.987' AS TIME), 'HH mm ss.f') AS "time";
time
------------------
11 22 33.9
TO_CHAR(
date_exp/datetime_exp/time_exp,
string_exp)
输入:
- 日期/时间/时间表达式。如果
null
,则函数返回null
。 - 格式模式。如果
null
或空字符串,则函数返回null
。
输出:字符串
描述:使用第二个参数中指定的格式将日期/日期时间/时间返回为字符串。格式化模式符合 用于日期/时间格式化的 PostgreSQL 模板模式。
如果第一个参数的类型为 time
,则第二个参数指定的模式不能包含与日期相关的单位(例如,dd、MM、YYYY 等)。如果它包含此类单位,则会返回错误。
在某些情况下,模式 TZ
和 tz
(时区缩写)的结果与 PostgreSQL 中 TO_CHAR
返回的结果不同。原因是 JDK 指定的时区缩写与 PostgreSQL 指定的时区缩写不同。此函数可能会显示实际的时区缩写,而不是 PostgreSQL 实现返回的通用 LMT
或空字符串或偏移量。夏季/日光标记在两种实现之间也可能有所不同(例如,对于夏威夷,将显示 HT
而不是 HST
)。
不支持 FX
、TM
、SP
模式修饰符,它们将在输出中显示为 FX
、TM
、SP
文本。
SELECT TO_CHAR(CAST('2020-04-05' AS DATE), 'DD/MM/YYYY') AS "date";
date
------------------
05/04/2020
SELECT TO_CHAR(CAST('2020-04-05T11:22:33.987654' AS DATETIME), 'DD/MM/YYYY HH24:MI:SS.FF2') AS "datetime";
datetime
------------------
05/04/2020 11:22:33.98
SELECT TO_CHAR(CAST('23:22:33.987' AS TIME), 'HH12 MI SS.FF1') AS "time";
time
------------------
11 22 33.9
DAY_OF_MONTH(datetime_exp)
输入:
- 日期/时间表达式。如果
null
,则函数返回null
。
输出:整数
描述:从日期/日期时间中提取月份中的日。
SELECT DAY_OF_MONTH(CAST('2018-02-19T10:23:27Z' AS TIMESTAMP)) AS day;
day
---------------
19
DAY_OF_WEEK(datetime_exp)
输入:
- 日期/时间表达式。如果
null
,则函数返回null
。
输出:整数
描述:从日期/日期时间中提取星期几。星期日是 1
,星期一是 2
,等等。
SELECT DAY_OF_WEEK(CAST('2018-02-19T10:23:27Z' AS TIMESTAMP)) AS day;
day
---------------
2
DAY_OF_YEAR(datetime_exp)
输入:
- 日期/时间表达式。如果
null
,则函数返回null
。
输出:整数
描述:从日期/日期时间中提取一年中的日。
SELECT DAY_OF_YEAR(CAST('2018-02-19T10:23:27Z' AS TIMESTAMP)) AS day;
day
---------------
50
DAY_NAME(datetime_exp)
输入:
- 日期/时间表达式。如果
null
,则函数返回null
。
输出:字符串
描述:以文本格式(Monday
、Tuesday
…)从日期/日期时间中提取星期几。
SELECT DAY_NAME(CAST('2018-02-19T10:23:27Z' AS TIMESTAMP)) AS day;
day
---------------
Monday
HOUR_OF_DAY(datetime_exp)
输入:
- 日期/时间表达式。如果
null
,则函数返回null
。
输出:整数
描述:从日期/日期时间中提取一天中的小时。
SELECT HOUR_OF_DAY(CAST('2018-02-19T10:23:27Z' AS TIMESTAMP)) AS hour;
hour
---------------
10
ISO_DAY_OF_WEEK(datetime_exp)
输入:
- 日期/时间表达式。如果
null
,则函数返回null
。
输出:整数
描述:按照 ISO 8601 标准,从日期/日期时间中提取星期几。星期一是 1
,星期二是 2
,等等。
SELECT ISO_DAY_OF_WEEK(CAST('2018-02-19T10:23:27Z' AS TIMESTAMP)) AS day;
day
---------------
1
ISO_WEEK_OF_YEAR(datetime_exp)
输入:
- 日期/时间表达式。如果
null
,则函数返回null
。
输出:整数
描述:按照 ISO 8601 标准,从日期/日期时间中提取一年中的周。一年的第一周是其大多数(4 天或更多)日子在一月份的第一周。
SELECT ISO_WEEK_OF_YEAR(CAST('2018-02-19T10:23:27Z' AS TIMESTAMP)) AS week;
week
---------------
8
MINUTE_OF_DAY(datetime_exp)
输入:
- 日期/时间表达式。如果
null
,则函数返回null
。
输出:整数
描述:从日期/日期时间中提取一天中的分钟。
SELECT MINUTE_OF_DAY(CAST('2018-02-19T10:23:27Z' AS TIMESTAMP)) AS minute;
minute
---------------
623
MINUTE_OF_HOUR(datetime_exp)
输入:
- 日期/时间表达式。如果
null
,则函数返回null
。
输出:整数
描述:从日期/日期时间中提取小时中的分钟。
SELECT MINUTE_OF_HOUR(CAST('2018-02-19T10:23:27Z' AS TIMESTAMP)) AS minute;
minute
---------------
23
MONTH(datetime_exp)
输入:
- 日期/时间表达式。如果
null
,则函数返回null
。
输出:整数
描述:从日期/日期时间中提取一年中的月份。
SELECT MONTH_OF_YEAR(CAST('2018-02-19T10:23:27Z' AS TIMESTAMP)) AS month;
month
---------------
2
MONTH_NAME(datetime_exp)
输入:
- 日期/时间表达式。如果
null
,则函数返回null
。
输出:字符串
描述:以文本格式(January
、February
…)从日期/日期时间中提取月份。
SELECT MONTH_NAME(CAST('2018-02-19T10:23:27Z' AS TIMESTAMP)) AS month;
month
---------------
February
NOW()
输入:无
输出:日期时间
描述:此函数提供与 CURRENT_TIMESTAMP() 函数相同的功能:返回当前查询到达服务器时的日期时间。对于同一查询中的每次出现,此方法始终返回相同的值。
SELECT NOW() AS result;
result
------------------------
2018-12-12T14:48:52.448Z
通常,此函数(及其孪生函数 CURRENT_TIMESTAMP())用于相对日期/时间过滤。
SELECT first_name FROM emp WHERE hire_date > NOW() - INTERVAL 100 YEARS ORDER BY first_name ASC LIMIT 5;
first_name
---------------
Alejandro
Amabile
Anneke
Anoosh
Arumugam
SECOND_OF_MINUTE(datetime_exp)
输入:
- 日期/时间表达式。如果
null
,则函数返回null
。
输出:整数
描述:从日期/日期时间中提取分钟中的秒。
SELECT SECOND_OF_MINUTE(CAST('2018-02-19T10:23:27Z' AS TIMESTAMP)) AS second;
second
---------------
27
QUARTER(datetime_exp)
输入:
- 日期/时间表达式。如果
null
,则函数返回null
。
输出:整数
描述:提取日期/日期时间所在的年份季度。
SELECT QUARTER(CAST('2018-02-19T10:23:27Z' AS TIMESTAMP)) AS quarter;
quarter
---------------
1
TODAY()
输入:无
输出:日期
描述:此函数提供与 CURRENT_DATE() 函数相同的功能:返回当前查询到达服务器时的日期。对于同一查询中的每次出现,此方法始终返回相同的值。
SELECT TODAY() AS result;
result
------------------------
2018-12-12
通常,此函数(及其孪生函数 CURRENT_TIMESTAMP())用于相对日期过滤。
SELECT first_name FROM emp WHERE hire_date > TODAY() - INTERVAL 35 YEARS ORDER BY first_name ASC LIMIT 5;
first_name
------------
Alejandro
Amabile
Anoosh
Basil
Brendon
WEEK_OF_YEAR(datetime_exp)
输入:
- 日期/时间表达式。如果
null
,则函数返回null
。
输出:整数
描述:从日期/日期时间中提取一年中的周。
SELECT WEEK(CAST('1988-01-05T09:22:10Z' AS TIMESTAMP)) AS week, ISOWEEK(CAST('1988-01-05T09:22:10Z' AS TIMESTAMP)) AS isoweek;
week | isoweek
---------------+---------------
2 |1
YEAR(datetime_exp)
输入:
- 日期/时间表达式。如果
null
,则函数返回null
。
输出:整数
描述:从日期/日期时间中提取年份。
SELECT YEAR(CAST('2018-02-19T10:23:27Z' AS TIMESTAMP)) AS year;
year
---------------
2018
EXTRACT(
datetime_function
FROM datetime_exp)
输入:
- 日期/时间函数名称
- 日期/日期时间表达式
输出:整数
描述:通过指定日期时间函数的名称,从日期/日期时间中提取字段。以下
SELECT EXTRACT(DAY_OF_YEAR FROM CAST('2018-02-19T10:23:27Z' AS TIMESTAMP)) AS day;
day
---------------
50
等效于
SELECT DAY_OF_YEAR(CAST('2018-02-19T10:23:27Z' AS TIMESTAMP)) AS day;
day
---------------
50