时间函数

Lindorm时间函数可以实现指定类型的数据与TIMESTAMP时间戳之间的相互转换,并支持计算两个时间戳之间相差的天数。本文介绍Lindorm支持的时间函数及其使用方法。

引擎与版本

函数列表

Lindorm支持的时间函数如下表所示。

函数

说明

DATE_FORMAT

TIMESTAMP类型的时间戳基于当前会话时区进行格式化输出。

FROM_UNIXTIME

Number类型(例如BIGINT、INTEGER、SMALLINT、TINYINT等数值类型)转换成当前会话时区的TIMESTAMP时间戳,如果存在两个参数,则按照第二个参数进行格式化输出。

DATEDIFF

计算两个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

该星期的第几天,数值。0代表星期日(Sunday),1代表星期一(Monday),以此类推。

%Y

四位数的数值。

年份,四位数的数值。例如2025

%y

两位数的数值,取年份的后两位。

年份,两位数的数值,取年份的后两位,例如2024,取后两位为24

%%

%

输出一个%字符。

%x

x

输出x,x为保留英文字母以外的字符。例如:U为非保留英文字母,输入%U后,会输出U

重要

不设置格式符时,输入任意字符,则所有不是以%开头的字符都将按照原格式输出。

示例

将当前时区的时间戳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时区下自197011000之后经过的秒数。FROM_UNIXTIME函数会将该值转换为当前会话时区TIMESTAMP时间戳。

format

格式说明符,详情请参见支持的格式说明符

示例

  • 示例一:

    1. epoch时间戳10.1578转换成当前时区的TIMESTAMP。

      SELECT FROM_UNIXTIME(10.1578);

      返回结果:

      +-------------------------+
      | EXPR$0                  |
      +-------------------------+
      | 1970-01-01 08:00:10.158 |
      +-------------------------+
    2. 会话时区修改为+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 |
      +-------------------------+
  • 示例二:

    1. 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 |
      +------------------------------+
    2. 会话时区修改为+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 |
    +--------+