Lindorm时间函数可以实现指定类型的数据与TIMESTAMP时间戳之间的相互转换,并支持计算两个时间戳之间相差的天数。本文介绍Lindorm支持的时间函数及其使用方法。
引擎与版本
函数列表
Lindorm支持的时间函数如下表所示。
函数 | 说明 |
将TIMESTAMP类型的时间戳基于当前会话时区进行格式化输出。 | |
将Number类型(例如BIGINT、INTEGER、SMALLINT、TINYINT等数值类型)转换成当前会话时区的TIMESTAMP时间戳,如果存在两个参数,则按照第二个参数进行格式化输出。 | |
计算两个TIMESTAMP类型的时间戳在当前会话时区下日期相隔的天数。 |
DATE_FORMAT
将TIMESTAMP类型的数据基于当前会话时区进行格式化输出。如何查看或设置会话时区,请参见如何设置连接时区。
语法
DATE_FORMAT(TIMESTAMP ts, STRING format)
参数说明
参数 | 是否必填 | 说明 |
ts | 是 | 待格式化输出的时间戳。 |
format | 是 | 格式说明符,具体格式为 |
支持的格式说明符、使用格式说明符后输出的内容及其详细介绍如下表所示:
格式说明符 | 输出 | 输出说明 |
%a | Sun~Sat | 星期,英文缩写。 |
%b | Jan~Dec | 月份,英文缩写。 |
%c | 0~12 | 月份,数值。 |
%D | 1st、2nd、3rd…… | 该月的第几天,带英文序数后缀。 |
%d | 00~31 | 该月的第几天,两位数的数值。 |
%e | 00~31 | 该月的第几天,数值。 |
%f | 000000~999999 | 微秒。 |
%H | 00~23 | 时间的时钟,两位数的数值,24小时制。 |
%h | 01~12 | 时间的时钟,两位数的数值,12小时制。 |
%I | 01~12 | 时间的时钟,两位数的数值,12小时制。 |
%i | 00~59 | 时间的分钟,两位数的数值。 |
%j | 001~366 | 该年的第几天,三位数的数值。 |
%k | 0~23 | 时间的时钟,数值,24小时制。 |
%l | 1~12 | 时间的时钟,数值,12小时制。 |
%M | January~December | 月份,英文全称。 |
%m | 01~12 | 月份,两位数的数值。 |
%p | AM、PM | 上午或者下午。 |
%r | hh:mm:ss AM/PM | 时间的时分秒(hh:mm:ss),12小时制,带上午(AM)或下午(PM)信息。 |
%S | 00~59 | 时间的秒数,两位数的数值。 |
%s | 00~59 | 时间的秒数,两位数的数值。 |
%T | hh:mm:ss | 时间的时分秒(hh:mm:ss),24小时制。 |
%W | Sunday~Saturday | 星期,英文全称。 |
%w | 0~6 | 该星期的第几天,数值。 |
%Y | 四位数的数值。 | 年份,四位数的数值。例如 |
%y | 两位数的数值,取年份的后两位。 | 年份,两位数的数值,取年份的后两位,例如 |
%% | % | 输出一个%字符。 |
%x | x | 输出x,x为保留英文字母以外的字符。例如: |
不设置格式符时,输入任意字符,则所有不是以%
开头的字符都将按照原格式输出。
示例
将当前时区的时间戳2024-01-01 17:20:35
打印为at 17:20:35 on Jan 1st, 2024
。
SELECT DATE_FORMAT('2024-01-01 17:20:35', 'at %T on %b %D, %Y');
返回结果:
+------------------------------+
| EXPR$0 |
+------------------------------+
| at 17:20:35 on JAN 1st, 2024 |
+------------------------------+
返回结果是该时间戳在当前会话时区下,按照格式说明符打印出来的字符串。
FROM_UNIXTIME
将Number类型(例如BIGINT、INTEGER、SMALLINT、TINYINT等数值类型)转换成当前会话时区的TIMESTAMP时间戳,如果存在两个参数,则按照第二个参数进行格式化输出。
Number类型的单位为秒(s),最多保留3位有效数字。
语法
转换成当前会话时区的TIMESTAMP。
FROM_UNIXTIME (Number seconds)
先转换成当前会话时区的TIMESTAMP,再格式化输出。
FROM_UNIXTIME (Number seconds, STRING format)
参数说明
参数 | 是否必填 | 说明 |
seconds | 是 | epoch时间戳,单位为秒(s),最多保留3位小数。 seconds参数的值不考虑时区设置,仅表示GMT时区下自 |
format | 否 | 格式说明符,详情请参见支持的格式说明符。 |
示例
示例一:
将epoch时间戳
10.1578
转换成当前时区的TIMESTAMP。SELECT FROM_UNIXTIME(10.1578);
返回结果:
+-------------------------+ | EXPR$0 | +-------------------------+ | 1970-01-01 08:00:10.158 | +-------------------------+
会话时区修改为
+03:00
后,将epoch时间戳10.1578
转换成新时区的TIMESTAMP时间戳。-- 修改会话时区为+03:00 SET @@time_zone='+03:00'; -- 转换为新时区的TIMESTAMP SELECT FROM_UNIXTIME(10.1578);
说明仅MySQL协议支持修改连接时区。MySQL协议连接方式,请参见使用MySQL协议(推荐)和通过MySQL命令行连接并使用宽表引擎。
返回结果:
+-------------------------+ | EXPR$0 | +-------------------------+ | 1970-01-01 03:00:10.158 | +-------------------------+
示例二:
将epoch时间戳
10.1578
转换成当前时区的TIMESTAMP,并按照指定格式输出。SELECT FROM_UNIXTIME(10.1578, 'at %T on %b %D, %Y');
返回结果:
+------------------------------+ | EXPR$0 | +------------------------------+ | at 08:00:10 on JAN 1st, 1970 | +------------------------------+
会话时区修改为
+03:00
后,将epoch时间戳10.1578
转换成新时区的TIMESTAMP,并按照指定格式输出。-- 修改会话时区为+03:00 SET @@time_zone='+03:00'; -- 转换为新时区的TIMESTAMP SELECT FROM_UNIXTIME(10.1578, 'at %T on %b %D, %Y');
返回结果:
+------------------------------+ | EXPR$0 | +------------------------------+ | at 03:00:10 on JAN 1st, 1970 | +------------------------------+
DATEDIFF
计算两个TIMESTAMP类型的时间戳,在当前会话时区下日期相隔的天数。
计算方式:用前者减去后者
若结果为正数,则第一个时间戳表示的日期更晚。
若结果为负数,则第一个时间戳表示的日期更早。
若结果为
0
,表示两个时间戳的日期是同一天。
系统会自动忽略时分秒信息,仅比较日期。
语法
DATEDIFF(TIMESTAMP ts1, TIMESTAMP ts2)
参数说明
参数 | 是否必填 | 说明 |
ts1 | 是 | 第一个时间戳。 |
ts2 | 是 | 第二个时间戳。 |
示例
示例一:
SELECT DATEDIFF('2024-01-01 15:30:00', '2024-01-02 00:59:59');
返回结果
+--------+ | EXPR$0 | +--------+ | -1 | +--------+
示例二:
SELECT DATEDIFF('2024-01-05 15:30:00', '2024-01-02 00:59:59');
返回结果
+--------+ | EXPR$0 | +--------+ | 3 | +--------+
示例三:
SELECT DATEDIFF('2024-01-02 15:30:00', '2024-01-02 00:59:59');
返回结果
+--------+ | EXPR$0 | +--------+ | 0 | +--------+