日期和时间函数

注意,CURTIME()UTC_TIME()UTC_TIMESTAMP()TIMEDIFF() 可以通过任意转换函数如 BIGINT()DOUBLE() 等提升为数字类型。

NOW()

返回当前时间戳,类型为 INTEGER。

‹›
  • SQL
SQL
📋
select NOW();
‹›
Response
+------------+
| NOW()      |
+------------+
| 1615788407 |
+------------+

CURTIME()

返回本地时区当前时间,格式为 hh:ii:ss

‹›
  • SQL
SQL
📋
select CURTIME();
‹›
Response
+-----------+
| CURTIME() |
+-----------+
| 07:06:30  |
+-----------+

CURDATE()

返回本地时区当前日期,格式为 YYYY-MM-DD

‹›
  • SQL
SQL
📋
select curdate();
‹›
Response
+------------+
| curdate()  |
+------------+
| 2023-08-02 |
+------------+

UTC_TIME()

返回 UTC 时区当前时间,格式为 hh:ii:ss

‹›
  • SQL
SQL
📋
select UTC_TIME();
‹›
Response
+------------+
| UTC_TIME() |
+------------+
| 06:06:18   |
+------------+

UTC_TIMESTAMP()

返回 UTC 时区当前时间,格式为 YYYY-MM-DD hh:ii:ss

‹›
  • SQL
SQL
📋
select UTC_TIMESTAMP();
‹›
Response
+---------------------+
| UTC_TIMESTAMP()     |
+---------------------+
| 2021-03-15 06:06:03 |
+---------------------+

SECOND()

根据当前时区,从时间戳参数中返回整数秒数(范围为 0..59)。

‹›
  • SQL
SQL
📋
select second(now());
‹›
Response
+---------------+
| second(now()) |
+---------------+
| 52            |
+---------------+

MINUTE()

根据当前时区,从时间戳参数中返回整数分钟数(范围为 0..59)。

‹›
  • SQL
SQL
📋
select minute(now());
‹›
Response
+---------------+
| minute(now()) |
+---------------+
| 5             |
+---------------+

HOUR()

根据当前时区,从时间戳参数中返回整数小时数(范围为 0..23)。

‹›
  • SQL
SQL
📋
select hour(now());
‹›
Response
+-------------+
| hour(now()) |
+-------------+
| 7           |
+-------------+

DAY()

根据当前时区,从时间戳参数中返回当前月份的整数天数(范围为 1..31)。

‹›
  • SQL
SQL
📋
select day(now());
‹›
Response
+------------+
| day(now()) |
+------------+
| 15         |
+------------+

MONTH()

根据当前时区,从时间戳参数中返回整数月份(范围为 1..12)。

‹›
  • SQL
SQL
📋
select month(now());
‹›
Response
+--------------+
| month(now()) |
+--------------+
| 3            |
+--------------+

QUARTER()

根据当前时区,从时间戳参数中返回当前季度的整数值(范围为 1..4)。

‹›
  • SQL
SQL
📋
select quarter(now());
‹›
Response
+----------------+
| quarter(now()) |
+----------------+
| 2              |
+----------------+

YEAR()

根据当前时区,从时间戳参数中返回整数年份(范围为 1969..2038)。

‹›
  • SQL
SQL
📋
select year(now());
‹›
Response
+-------------+
| year(now()) |
+-------------+
| 2024        |
+-------------+

DAYNAME()

根据当前时区,从时间戳参数返回星期名称。

‹›
  • SQL
SQL
📋
select dayname(now());
‹›
Response
+----------------+
| dayname(now()) |
+----------------+
| Wednesday      |
+----------------+

MONTHNAME()

根据当前时区,从时间戳参数返回月份名称。

‹›
  • SQL
SQL
📋
select monthname(now());
‹›
Response
+------------------+
| monthname(now()) |
+------------------+
| August           |
+------------------+

DAYOFWEEK()

根据当前时区,从时间戳参数返回星期的整数索引(范围 1..7)。 注意,星期从星期天开始。

‹›
  • SQL
SQL
📋
select dayofweek(now());
‹›
Response
+------------------+
| dayofweek(now()) |
+------------------+
| 5                |
+------------------+

DAYOFYEAR()

根据当前时区,从时间戳参数返回今年的第几天(范围 1..366)。

‹›
  • SQL
SQL
📋
select dayofyear(now());
‹›
Response
+------------------+
| dayofyear(now()) |
+------------------+
|              214 |
+------------------+

YEARWEEK()

根据当前时区,从时间戳参数返回当前周第一天的年份和日代码的整数(范围 1969001..2038366)。

‹›
  • SQL
SQL
📋
select yearweek(now());
‹›
Response
+-----------------+
| yearweek(now()) |
+-----------------+
|         2023211 |
+-----------------+

YEARMONTH()

根据当前时区,从时间戳参数返回年份和月份的整数代码(范围 196912..203801)。

‹›
  • SQL
SQL
📋
select yearmonth(now());
‹›
Response
+------------------+
| yearmonth(now()) |
+------------------+
| 202103           |
+------------------+

YEARMONTHDAY()

根据当前时区,返回年份、月份和日期的整数代码(范围从 19691231 到 20380119)。

‹›
  • SQL
SQL
📋
select yearmonthday(now());
‹›
Response
+---------------------+
| yearmonthday(now()) |
+---------------------+
| 20210315            |
+---------------------+

TIMEDIFF()

计算两个时间戳之间的差值,格式为 hh:ii:ss

‹›
  • SQL
SQL
📋
select timediff(1615787586, 1613787583);
‹›
Response
+----------------------------------+
| timediff(1615787586, 1613787583) |
+----------------------------------+
| 555:33:23                        |
+----------------------------------+

DATEDIFF()

计算两个给定时间戳之间的天数。

‹›
  • SQL
SQL
📋
select datediff(1615787586, 1613787583);
‹›
Response
+----------------------------------+
| datediff(1615787586, 1613787583) |
+----------------------------------+
|                               23 |
+----------------------------------+

DATE()

将时间戳参数的日期部分格式化为字符串,格式为 YYYY-MM-DD

‹›
  • SQL
SQL
📋
select date(now());
‹›
Response
+-------------+
| date(now()) |
+-------------+
| 2023-08-02  |
+-------------+

TIME()

将时间戳参数的时间部分格式化为字符串,格式为 HH:MM:SS

‹›
  • SQL
SQL
📋
select time(now());
‹›
Response
+-------------+
| time(now()) |
+-------------+
| 15:21:27    |
+-------------+

DATE_FORMAT()

根据提供的日期和格式参数返回格式化字符串。格式参数使用与 strftime 函数相同的格式说明符。为方便起见,以下是一些常用格式说明符:

  • %Y - 四位数年份
  • %m - 两位数月份(01-12)
  • %d - 两位数字的月份中的天(01-31)
  • %H - 两位数字的小时(00-23)
  • %M - 两位数字的分钟(00-59)
  • %S - 两位数字的秒钟(00-59)
  • %T - 24 小时制时间(%H:%M:%S

注意,这不是完整的格式说明符列表。请查阅您操作系统的 strftime() 文档以获取完整列表。

‹›
  • SQL
SQL
📋
SELECT DATE_FORMAT(NOW(), 'year %Y and time %T');
‹›
Response
+------------------------------------------+
| DATE_FORMAT(NOW(), 'year %Y and time %T') |
+------------------------------------------+
| year 2023 and time 11:54:52              |
+------------------------------------------+

此示例格式化当前日期和时间,显示四位数年份和24小时制时间。

DATE_HISTOGRAM()

DATE_HISTOGRAM(expr, {calendar_interval='unit_name'}) 接受一个以单位名称为单位的桶大小,并返回该值对应的桶编号。值会被四舍五入到最接近的桶。关键函数为:

key_of_the_bucket = interval * floor ( value / interval )

间隔可以用单位名称指定,如 week,或者用单个单位,如 1M。但使用 calendar_interval 不支持多单位,如 2d,而 fixed_interval 允许。

calendar_interval 合法的间隔包括:

  • minute, 1m
  • hour, 1h
  • day, 1d
  • week, 1w(一周是从周开始的那一天、小时、分钟、秒,到下一周同一天同一时间的间隔)
  • month, 1M
  • year, 1y(一年是在本月开始的那一天和时间,到下一年同一月同一天同一时间的间隔)

fixed_interval 合法的间隔包括:

  • minute, 2m
  • hour, 3h
  • day, 5d

用于聚合、FACET 和分组。

示例:

SELECT COUNT(*),
DATE_HISTOGRAM(tm, {calendar_interval='month'}) AS months
FROM facets
GROUP BY months ORDER BY months ASC;

DATE_RANGE()

DATE_RANGE(expr, {range_from='date_math', range_to='date_math'}) 接受一组区间并返回该值对应的桶编号。 表达式包括每个区间的 range_from 值,但不包括 range_to 值。区间可以是开放的——只有 range_from 或只有 range_to。 这一点与 RANGE() 函数的区别在于,range_fromrange_to 可以用 日期数学 表达式表示。

用于聚合、FACET 和分组。

示例:

SELECT COUNT(*),
DATE_RANGE(tm, {range_to='2017||+2M/M'},{range_from='2017||+2M/M',range_to='2017||+5M/M'},{range_from='2017||+5M/M'}) AS points
FROM idx_dates
GROUP BY points ORDER BY points ASC;
日期数学

日期数学让你能够直接在搜索中处理日期和时间。它对于处理随时间变化的数据特别有用。使用日期数学,你可以轻松完成诸如查找特定时间段的条目、分析数据趋势、或管理信息删除时间等操作。它简化了对日期的操作,允许你在查询中添加或减少时间,按最近的时间单位取整等。

使用日期数学时,需要以基础日期开始,该基础日期可以是:

  • 当前日期时间的 now
  • 或以 || 结束的特定日期字符串。

然后,你可以用以下操作修改此日期:

  • +1y 表示加一年,
  • -1h 表示减一小时,
  • /m 表示取整到最近的月份。

在操作中你可以使用以下单位:

  • s 表示秒,
  • m 表示分钟,
  • h(或 H)表示小时,
  • d 表示天,
  • w 表示周,
  • M 表示月,
  • y 表示年。

以下是一些日期数学的使用示例:

  • now+4h 表示四小时后的当前时间。
  • now-2d/d 表示两天前的时间,按天取整。
  • 2010-04-20||+2M/d 表示2010年6月20日,按天取整。
Last modified: August 28, 2025