[TOC] #### 7.2.1.1 convert\_tz **函数定义** ~~~ DATETIME CONVERT_TZ(DATETIME dt, VARCHAR from_tz, VARCHAR to_tz) ~~~ 将DATETIME值 dt 由 from\_tz 时区转换到 to\_tz 时区,返回转换后的值。 如果参数无效该函数返回NULL。 **示例** ~~~ mysql> select convert_tz('2019-08-01 13:21:03', 'Asia/Shanghai', 'America/Los_Angeles'); +---------------------------------------------------------------------------+ | convert_tz('2019-08-01 13:21:03', 'Asia/Shanghai', 'America/Los_Angeles') | +---------------------------------------------------------------------------+ | 2019-07-31 22:21:03 | +---------------------------------------------------------------------------+ mysql> select convert_tz('2019-08-01 13:21:03', '+08:00', 'America/Los_Angeles'); +--------------------------------------------------------------------+ | convert_tz('2019-08-01 13:21:03', '+08:00', 'America/Los_Angeles') | +--------------------------------------------------------------------+ | 2019-07-31 22:21:03 | +--------------------------------------------------------------------+ ~~~ **关键字** `CONVERT_TZ` <br> #### 7.2.1.2 curdate **函数定义** ~~~ DATE CURDATE() ~~~ 获取当前的日期,以DATE类型返回。 **示例** ~~~ mysql> SELECT CURDATE(); +------------+ | CURDATE() | +------------+ | 2019-12-20 | +------------+ mysql> SELECT CURDATE() + 0; +---------------+ | CURDATE() + 0 | +---------------+ | 20191220 | +---------------+ ~~~ **关键字** `CURDATE` <br> #### 7.2.1.3 current\_timestamp **函数定义** ~~~ DATETIME CURRENT_TIMESTAMP() ~~~ 获得当前的时间,以DATETIME类型返回。 **示例** ~~~ mysql> select current_timestamp(); +---------------------+ | current_timestamp() | +---------------------+ | 2019-05-27 15:59:33 | +---------------------+ ~~~ **关键字** `CURRENT_TIMESTAMP,CURRENT,TIMESTAMP` <br> #### 7.2.1.4 curtime,current\_time **函数定义** ~~~ TIME CURTIME() ~~~ 获得当前的时间,以TIME类型返回。 **示例** ~~~ mysql> select current_time(); +----------------+ | current_time() | +----------------+ | 15:25:47 | +----------------+ ~~~ **关键字** `CURTIME,CURRENT_TIME` <br> #### 7.2.1.5 date\_add **函数定义** ~~~ INT DATE_ADD(DATETIME date,INTERVAL expr type) ~~~ 向日期添加指定的时间间隔。date 参数是合法的日期表达式;expr 参数是希望添加的时间间隔;type 参数指定时间间隔的单位,可以是下列值:YEAR, MONTH, DAY, HOUR, MINUTE, SECOND,分别表示年、月、日、小时、分钟、秒。 **示例** ~~~ mysql> select date_add('2010-11-30 23:59:59', INTERVAL 2 DAY); +-------------------------------------------------+ | date_add('2010-11-30 23:59:59', INTERVAL 2 DAY) | +-------------------------------------------------+ | 2010-12-02 23:59:59 | +-------------------------------------------------+ ~~~ **关键字** `DATE_ADD,DATE,ADD` <br> #### 7.2.1.6 date\_format **函数定义** ~~~ VARCHAR DATE_FORMAT(DATETIME date, VARCHAR format) ~~~ 将日期类型按照format定义的格式转化为字符串。当前支持最大128字节的字符串,如果返回值长度超过128,则返回NULL。 date 参数是合法的日期。format 规定日期/时间的输出格式,支持的格式包括: * %a : 缩写星期名 * %b : 缩写月名 * %c : 月,数值 * %D : 带有英文前缀的月中的天 * %d : 月的天,数值(00-31) * %e : 月的天,数值(0-31) * %f : 微秒 * %H : 小时 (00-23) * %h : 小时 (01-12) * %I : 小时 (01-12) * %i : 分钟,数值(00-59) * %j : 年的天 (001-366) * %k : 小时 (0-23) * %l : 小时 (1-12) * %M : 月名 * %m : 月,数值(00-12) * %p : AM 或 PM * %r : 时间,12-小时(hh:mm:ss AM 或 PM) * %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 : 星期名 * %w : 周的天 (0=星期日, 6=星期六) * %X : 年,其中的星期日是周的第一天,4 位,与 %V 使用 * %x : 年,其中的星期一是周的第一天,4 位,与 %v 使用 * %Y : 年,4 位 * %y : 年,2 位 * %% : 用于表示 % **示例** ~~~ mysql> select date_format('2009-10-04 22:23:00', '%W %M %Y'); +------------------------------------------------+ | date_format('2009-10-04 22:23:00', '%W %M %Y') | +------------------------------------------------+ | Sunday October 2009 | +------------------------------------------------+ mysql> select date_format('2007-10-04 22:23:00', '%H:%i:%s'); +------------------------------------------------+ | date_format('2007-10-04 22:23:00', '%H:%i:%s') | +------------------------------------------------+ | 22:23:00 | +------------------------------------------------+ mysql> select date_format('1900-10-04 22:23:00', '%D %y %a %d %m %b %j'); +------------------------------------------------------------+ | date_format('1900-10-04 22:23:00', '%D %y %a %d %m %b %j') | +------------------------------------------------------------+ | 4th 00 Thu 04 10 Oct 277 | +------------------------------------------------------------+ mysql> select date_format('1997-10-04 22:23:00', '%H %k %I %r %T %S %w'); +------------------------------------------------------------+ | date_format('1997-10-04 22:23:00', '%H %k %I %r %T %S %w') | +------------------------------------------------------------+ | 22 22 10 10:23:00 PM 22:23:00 00 6 | +------------------------------------------------------------+ mysql> select date_format('1999-01-01 00:00:00', '%X %V'); +---------------------------------------------+ | date_format('1999-01-01 00:00:00', '%X %V') | +---------------------------------------------+ | 1998 52 | +---------------------------------------------+ mysql> select date_format('2006-06-01', '%d'); +------------------------------------------+ | date_format('2006-06-01 00:00:00', '%d') | +------------------------------------------+ | 01 | +------------------------------------------+ mysql> select date_format('2006-06-01', '%%%d'); +--------------------------------------------+ | date_format('2006-06-01 00:00:00', '%%%d') | +--------------------------------------------+ | %01 | +--------------------------------------------+ ~~~ **关键字** `DATE_FORMAT,DATE,FORMAT` <br> #### 7.2.1.7 date\_sub **函数定义** ~~~ INT DATE_SUB(DATETIME date,INTERVAL expr type) ~~~ 从日期减去指定的时间间隔。date 参数是合法的日期表达式;expr 参数是希望减去的时间间隔;type 参数指定时间间隔的单位,可以是下列值:YEAR, MONTH, DAY, HOUR, MINUTE, SECOND,分别表示年、月、日、小时、分钟、秒。 **示例** ~~~ mysql> select date_sub('2010-11-30 23:59:59', INTERVAL 2 DAY); +-------------------------------------------------+ | date_sub('2010-11-30 23:59:59', INTERVAL 2 DAY) | +-------------------------------------------------+ | 2010-11-28 23:59:59 | +-------------------------------------------------+ ~~~ **关键字** `DATE_SUB,DATE,SUB` <br> #### 7.2.1.8 datediff **函数定义** ~~~ DATETIME DATEDIFF(DATETIME expr1,DATETIME expr2) ~~~ 计算 expr1 - expr2,结果精确到天。expr1 和 expr2 参数是合法的日期或日期/时间表达式。 > 注:只有值的日期部分参与计算。 **示例** ~~~ mysql> select datediff(CAST('2007-12-31 23:59:59' AS DATETIME), CAST('2007-12-30' AS DATETIME)); +-----------------------------------------------------------------------------------+ | datediff(CAST('2007-12-31 23:59:59' AS DATETIME), CAST('2007-12-30' AS DATETIME)) | +-----------------------------------------------------------------------------------+ | 1 | +-----------------------------------------------------------------------------------+ mysql> select datediff(CAST('2010-11-30 23:59:59' AS DATETIME), CAST('2010-12-31' AS DATETIME)); +-----------------------------------------------------------------------------------+ | datediff(CAST('2010-11-30 23:59:59' AS DATETIME), CAST('2010-12-31' AS DATETIME)) | +-----------------------------------------------------------------------------------+ | -31 | +-----------------------------------------------------------------------------------+ ~~~ **关键字** `DATEDIFF` <br> #### 7.2.1.9 day **函数定义** ~~~ INT DAY(DATETIME date) ~~~ 获得日期中的天信息,返回值范围从1-31。参数date可为DATE或者DATETIME类型。 **示例** ~~~ mysql> select day('1987-01-31'); +----------------------------+ | day('1987-01-31 00:00:00') | +----------------------------+ | 31 | +----------------------------+ ~~~ **关键字** `DAY` <br> #### 7.2.1.10 dayname **函数定义** ~~~ VARCHAR DAYNAME(DATE) ~~~ 返回日期对应的日期名字。参数为Date或者Datetime类型。 **示例** ~~~ mysql> select dayname('2007-02-03 00:00:00'); +--------------------------------+ | dayname('2007-02-03 00:00:00') | +--------------------------------+ | Saturday | +--------------------------------+ ~~~ **关键字** `DAYNAME` <br> #### 7.2.1.11 dayofmonth **函数定义** ~~~ INT DAYOFMONTH(DATETIME date) ~~~ 获得日期中的天信息,返回值范围从1-31。参数date为DATE或者DATETIME类型。 **示例** ~~~ mysql> select dayofmonth('1987-01-31'); +-----------------------------------+ | dayofmonth('1987-01-31 00:00:00') | +-----------------------------------+ | 31 | +-----------------------------------+ ~~~ **关键字** `DAYOFMONTH` <br> #### 7.2.1.12 dayofweek **函数定义** ~~~ INT dayofweek(DATETIME date) ~~~ 该函数返回日期的工作日索引值,即星期日为1,星期一为2,……,星期六为7。 参数为Date或者Datetime类型或者可以CAST为Date或者Datetime类型的数字。 **示例** ~~~ mysql> select dayofweek('2019-06-25'); +----------------------------------+ | dayofweek('2019-06-25 00:00:00') | +----------------------------------+ | 3 | +----------------------------------+ mysql> select dayofweek(cast(20190625 as date)); +-----------------------------------+ | dayofweek(CAST(20190625 AS DATE)) | +-----------------------------------+ | 3 | +-----------------------------------+ ~~~ **关键字** `DAYOFWEEK` <br> #### 7.2.1.13 dayofyear **函数定义** ~~~ INT DAYOFYEAR(DATETIME date) ~~~ 获得日期中对应当年中的哪一天。参数为Date或者Datetime类型。 **示例** ~~~ mysql> select dayofyear('2007-02-03 00:00:00'); +----------------------------------+ | dayofyear('2007-02-03 00:00:00') | +----------------------------------+ | 34 | +----------------------------------+ ~~~ **关键字** `DAYOFYEAR` <br> #### 7.2.1.14 from\_days **函数定义** ~~~ DATE FROM_DAYS(INT N) ~~~ 通过距离0000-01-01日的天数来计算日期。 **示例** ~~~ mysql> select from_days(730669); +-------------------+ | from_days(730669) | +-------------------+ | 2000-07-03 | +-------------------+ ~~~ **关键字** `FROM_DAYS,FROM,DAYS` <br> #### 7.2.1.15 from\_unixtime **函数定义** ~~~ DATETIME FROM_UNIXTIME(INT unix_timestamp[, VARCHAR string_format]) ~~~ 将 Unix 时间戳转化为对应的 time 格式,返回的格式由 string\_format 指定。 有效的时间戳取值范围是:\[0,  253402271999\],对应于时间范围:1970-01-01 00:00:00 ~ 9999-12-31 23:59:59。如遇到无效时间戳,该函数返回 NULL。 输出格式默认为 "yyyy-MM-dd HH:mm:ss",支持的格式信息包括: * %Y:年  例:2014,1900 * %m:月  例:12,09 * %d:日 例:11,01 * %H:时  例:23,01,12 * %i:分 例:05,11 * %s:秒 例:59,01 遇到不支持的格式信息时,该函数返回NULL。 **示例** ~~~ mysql> select from_unixtime(1196440219); +---------------------------+ | from_unixtime(1196440219) | +---------------------------+ | 2007-12-01 00:30:19 | +---------------------------+ mysql> select from_unixtime(1196440219, 'yyyy-MM-dd HH:mm:ss'); +--------------------------------------------------+ | from_unixtime(1196440219, 'yyyy-MM-dd HH:mm:ss') | +--------------------------------------------------+ | 2007-12-01 00:30:19 | +--------------------------------------------------+ mysql> select from_unixtime(1196440219, '%Y-%m-%d'); +-----------------------------------------+ | from_unixtime(1196440219, '%Y-%m-%d') | +-----------------------------------------+ | 2007-12-01 | +-----------------------------------------+ mysql> select from_unixtime(1196440219, '%Y-%m-%d %H:%i:%s'); +--------------------------------------------------+ | from_unixtime(1196440219, '%Y-%m-%d %H:%i:%s') | +--------------------------------------------------+ | 2007-12-01 00:30:19 | +--------------------------------------------------+ ~~~ **关键字** `FROM_UNIXTIME,FROM,UNIXTIME` <br> #### 7.2.1.16 hour **函数定义** ~~~ INT HOUR(DATETIME date) ~~~ 获得日期中的小时的信息,返回值范围是\[0, 23\]。函数参数date为DATE或者DATETIME类型。 **示例** ~~~ mysql> select hour('2018-12-31 23:59:59'); +-----------------------------+ | hour('2018-12-31 23:59:59') | +-----------------------------+ | 23 | +-----------------------------+ ~~~ 关键字 `HOUR` <br> #### 7.2.1.17 minute **函数定义** ~~~ INT MINUTE(DATETIME date) ~~~ 获得日期中的分钟的信息,返回值范围是\[0, 59\]。函数参数date为DATE或者DATETIME类型。 **示例** ~~~ mysql> select minute('2018-12-31 23:59:59'); +-----------------------------+ | minute('2018-12-31 23:59:59') | +-----------------------------+ | 59 | +-----------------------------+ ~~~ **关键字** `MINUTE` <br> #### 7.2.1.18 month **函数定义** ~~~ INT MONTH(DATETIME date) ~~~ 返回时间类型中的月份信息,范围是\[1, 12\]。函数参数date为DATE或者DATETIME类型。 **示例** ~~~ mysql> select month('1987-01-01'); +-----------------------------+ | month('1987-01-01 00:00:00') | +-----------------------------+ | 1 | +-----------------------------+ ~~~ **关键字** `MONTH` <br> #### 7.2.1.19 monthname **函数定义** ~~~ VARCHAR MONTHNAME(DATE) ~~~ 返回日期对应的月份名字。参数为DATE或者DATETIME类型。 **示例** ~~~ mysql> select monthname('2008-02-03 00:00:00'); +----------------------------------+ | monthname('2008-02-03 00:00:00') | +----------------------------------+ | February | +----------------------------------+ ~~~ **关键字** `MONTHNAME` <br> #### 7.2.1.20 now **函数定义** ~~~ DATETIME NOW() ~~~ 获得当前的时间,以DATETIME类型返回。 **示例** ~~~ mysql> select now(); +---------------------+ | now() | +---------------------+ | 2019-05-27 15:58:25 | +---------------------+ ~~~ **关键字** `NOW` <br> #### 7.2.1.21 second **函数定义** ~~~ INT SECOND(DATETIME date) ~~~ 获得日期中的秒的信息,返回值范围是\[0, 59\]。参数为DATE或者DATETIME类型。 **示例** ~~~ mysql> select second('2018-12-31 23:59:59'); +-----------------------------+ | second('2018-12-31 23:59:59') | +-----------------------------+ | 59 | +-----------------------------+ ~~~ **关键字** `SECOND` <br> #### 7.2.1.22 str\_to\_date **函数定义** ~~~ DATETIME STR_TO_DATE(VARCHAR str, VARCHAR format) ~~~ 按format指定的格式将字符串 str 转化为 DATE 值,如果转化结果不对返回NULL。支持的格式与函数date\_format一致。 **示例** ~~~ mysql> select str_to_date('2014-12-21 12:34:56', '%Y-%m-%d %H:%i:%s'); +---------------------------------------------------------+ | str_to_date('2014-12-21 12:34:56', '%Y-%m-%d %H:%i:%s') | +---------------------------------------------------------+ | 2014-12-21 12:34:56 | +---------------------------------------------------------+ mysql> select str_to_date('2014-12-21 12:34%3A56', '%Y-%m-%d %H:%i%%3A%s'); +--------------------------------------------------------------+ | str_to_date('2014-12-21 12:34%3A56', '%Y-%m-%d %H:%i%%3A%s') | +--------------------------------------------------------------+ | 2014-12-21 12:34:56 | +--------------------------------------------------------------+ mysql> select str_to_date('200442 Monday', '%X%V %W'); +-----------------------------------------+ | str_to_date('200442 Monday', '%X%V %W') | +-----------------------------------------+ | 2004-10-18 | +-----------------------------------------+ mysql> select str_to_date("2020-09-01", "%Y-%m-%d %H:%i:%s"); +------------------------------------------------+ | str_to_date('2020-09-01', '%Y-%m-%d %H:%i:%s') | +------------------------------------------------+ | 2020-09-01 00:00:00 | +------------------------------------------------+ 1 row in set (0.01 sec) ~~~ **关键字** `STR_TO_DATE,STR,TO,DATE` <br> #### 7.2.1.23 timediff **函数定义** ~~~ TIME TIMEDIFF(DATETIME expr1, DATETIME expr2) ~~~ 该函数计算 expr1 - expr2 ,返回它们之间的时间差值。 **示例** ~~~ mysql> SELECT TIMEDIFF(now(),utc_timestamp()); +----------------------------------+ | timediff(now(), utc_timestamp()) | +----------------------------------+ | 08:00:00 | +----------------------------------+ mysql> SELECT TIMEDIFF('2019-07-11 16:59:30','2019-07-11 16:59:21'); +--------------------------------------------------------+ | timediff('2019-07-11 16:59:30', '2019-07-11 16:59:21') | +--------------------------------------------------------+ | 00:00:09 | +--------------------------------------------------------+ mysql> SELECT TIMEDIFF('2019-01-01 00:00:00', NULL); +---------------------------------------+ | timediff('2019-01-01 00:00:00', NULL) | +---------------------------------------+ | NULL | +---------------------------------------+ ~~~ **关键字** `TIMEDIFF` <br> #### 7.2.1.24 timestampadd **函数定义** ~~~ DATETIME TIMESTAMPADD(unit, interval, DATETIME datetime_expr) ~~~ 将整数表达式间隔添加到日期或日期时间表达式datetime\_expr中。interval是时间间隔,unit给出了时间间隔的单位。支持的时间单位包括:SECOND,MINUTE,HOUR,DAY,WEEK,MONTH,或者YEAR。 **示例** ~~~ mysql> SELECT TIMESTAMPADD(MINUTE,1,'2019-01-02'); +------------------------------------------------+ | timestampadd(MINUTE, 1, '2019-01-02 00:00:00') | +------------------------------------------------+ | 2019-01-02 00:01:00 | +------------------------------------------------+ mysql> SELECT TIMESTAMPADD(WEEK,1,'2019-01-02'); +----------------------------------------------+ | timestampadd(WEEK, 1, '2019-01-02 00:00:00') | +----------------------------------------------+ | 2019-01-09 00:00:00 | +----------------------------------------------+ ~~~ **关键字** `TIMESTAMPADD` <br> #### 7.2.1.25 timestampdiff **函数定义** ~~~ INT TIMESTAMPDIFF(unit,DATETIME datetime_expr1, DATETIME datetime_expr2) ~~~ 返回 datetime\_expr2 − datetime\_expr1 的值,其中 datetime\_expr1 和 datetime\_expr2 是日期或日期时间表达式。函数返回值(整数)表达的时间的单位由参数unit指定。有效的时间单位包括:SECOND,MINUTE,HOUR,DAY,WEEK,MONTH,或者YEAR。 **示例** ~~~ MySQL> SELECT TIMESTAMPDIFF(MONTH,'2003-02-01','2003-05-01'); +--------------------------------------------------------------------+ | timestampdiff(MONTH, '2003-02-01 00:00:00', '2003-05-01 00:00:00') | +--------------------------------------------------------------------+ | 3 | +--------------------------------------------------------------------+ MySQL> SELECT TIMESTAMPDIFF(YEAR,'2002-05-01','2001-01-01'); +-------------------------------------------------------------------+ | timestampdiff(YEAR, '2002-05-01 00:00:00', '2001-01-01 00:00:00') | +-------------------------------------------------------------------+ | -1 | +-------------------------------------------------------------------+ MySQL> SELECT TIMESTAMPDIFF(MINUTE,'2003-02-01','2003-05-01 12:05:55'); +---------------------------------------------------------------------+ | timestampdiff(MINUTE, '2003-02-01 00:00:00', '2003-05-01 12:05:55') | +---------------------------------------------------------------------+ | 128885 | +---------------------------------------------------------------------+ ~~~ **关键字** `TIMESTAMPDIFF` <br> #### 7.2.1.26 to\_days **函数定义** ~~~ INT TO_DAYS(DATETIME date) ~~~ 返回date表达的日期距离0000-01-01的天数。参数date可为DATE或者DATETIME类型。 **示例** ~~~ mysql> select to_days('2007-10-07'); +-----------------------+ | to_days('2007-10-07') | +-----------------------+ | 733321 | +-----------------------+ ~~~ **关键字** `TO_DAYS,TO,DAYS` <br> #### 7.2.1.27 unix\_timestamp **函数定义** ~~~ INT UNIX_TIMESTAMP() INT UNIX_TIMESTAMP(DATETIME date) INT UNIX_TIMESTAMP(DATETIME date, STRING fmt) ~~~ 将 DATE 或者 DATETIME 类型转化为 Unix 时间戳。 参数date的类型为DATE或DATETIME文字量(字符串),且有效的时间范围是:1970-01-01 00:00:00 至 2038-01-19 03:14:07。超出有效时间范围,该函数将范围NULL。 参数fmt用于指定date的格式,有效的格式请参阅 date\_format 函数的相关说明。如未指定fmt,则默认的格式为"yyyy-MM-dd HH:mm:ss"。 > 注:该函数受时区影响。 **示例** ~~~ mysql> select unix_timestamp(); +------------------+ | unix_timestamp() | +------------------+ | 1558589570 | +------------------+ mysql> select unix_timestamp('2007-11-30 10:30:19'); +---------------------------------------+ | unix_timestamp('2007-11-30 10:30:19') | +---------------------------------------+ | 1196389819 | +---------------------------------------+ mysql> select unix_timestamp('2007-11-30 10:30-19', '%Y-%m-%d %H:%i-%s'); +---------------------------------------+ | unix_timestamp('2007-11-30 10:30-19') | +---------------------------------------+ | 1196389819 | +---------------------------------------+ mysql> select unix_timestamp('2007-11-30 10:30%3A19', '%Y-%m-%d %H:%i%%3A%s'); +---------------------------------------+ | unix_timestamp('2007-11-30 10:30%3A19') | +---------------------------------------+ | 1196389819 | +---------------------------------------+ mysql> select unix_timestamp('1969-01-01 00:00:00'); +---------------------------------------+ | unix_timestamp('1969-01-01 00:00:00') | +---------------------------------------+ | 0 | +---------------------------------------+ ~~~ **关键字** `UNIX_TIMESTAMP,UNIX,TIMESTAMP` <br> #### 7.2.1.28 utc\_timestamp **函数定义** ~~~ DATETIME UTC_TIMESTAMP() ~~~ 取当前UTC日期和时间。如果该函数用在字符串语境中,则返回值的格式为"YYYY-MM-DD HH:MM:SS";如果函数用于数字语境中,则返回值的格式为"YYYYMMDDHHMMSS"。 **示例** ~~~ mysql> select utc_timestamp(),utc_timestamp() + 1; +---------------------+---------------------+ | utc_timestamp() | utc_timestamp() + 1 | +---------------------+---------------------+ | 2019-07-10 12:31:18 | 20190710123119 | +---------------------+---------------------+ ~~~ **关键字** `UTC_TIMESTAMP,UTC,TIMESTAMP` <br> #### 7.2.1.29 weekofyear **函数定义** ~~~ INT WEEKOFYEAR(DATETIME date) ~~~ 计算指定日期属于一年中的第几周。参数可为DATE或者DATETIME类型。 **示例** ~~~ mysql> select weekofyear('2008-02-20 00:00:00'); +-----------------------------------+ | weekofyear('2008-02-20 00:00:00') | +-----------------------------------+ | 8 | +-----------------------------------+ ~~~ **关键字** `WEEKOFYEAR` <br> #### 7.2.1.30 year **函数定义** ~~~ INT YEAR(DATETIME date) ~~~ 返回date类型的year部分,取值范围是\[1000, 9999\]。参数可为DATE或者DATETIME类型。 **示例** ~~~ mysql> select year('1987-01-01'); +-----------------------------+ | year('1987-01-01 00:00:00') | +-----------------------------+ | 1987 | +-----------------------------+ ~~~ **关键字** `YEAR` <br> #### 7.2.1.31 date\_trunc **背景** 当前DorisDB没有直接对时间进行截断的函数,但客户在使用时间函数时经常有关于group by hour / week这样的需求,而且希望能够第一列直接展示成时间的格式,希望有类似oracle 的trunc函数这样的方式来对datetime进行高效的截断,从而避免写出类似如下的低效sql: ~~~ select ADDDATE( DATE_FORMAT( DATE_ADD((from_unixtime(`自定义 SQL 查询`.`timestamp`)), INTERVAL 8 HOUR), '%Y-%m-%d %H:%i:00' ), INTERVAL 0 SECOND ) ,count(*) from xxx group 1 ; ~~~ **动机** 为了更快实现对时间数据的截断,现在需要提供向量化的date\_trunc系列函数。 原本我们已经有了year/month/day等直接截取部分的时间函数。 date\_trunc与此类似,对datetime进行高位截断: ~~~ date_trunc("minute", datetime): 2020-11-04 11:12:19 => 2020-11-04 11:12:00 ~~~ **函数签名** 1: Oracle使用的是TRUNC(date,\[fmt\])的函数格式。 2: PostgreSQL/redshift等使用的是date\_trunc(text,time)的函数格式。 <br> DorisDB采用date\_trunc(\[fmt\], datetime)的函数格式。 1: \[fmt\]支持字符串常量,但是必须为固定的几个值(second,minute,hour,day,month,year,week,quarter)。 2: \[fmt\]输入不对的值,在FE解析直接返回错误信息。 3: \[fmt\]/datetime输入常量的情况会被正确识别到,只处理一次。 | \[fmt\]格式字符串 | 格式字符串语义 | 对应的例子 | | --- | --- | --- | | second | 截断到秒作为有效时间 | 2020-10-25 11:15:32 => 2020-10-25 11:15:32 | | minute | 截断到分钟作为有效时间 | 2020-11-04 11:12:19 => 2020-11-04 11:12:00 | | hour | 截断到小时作为有效时间 | 2020-11-04 11:12:13 => 2020-11-04 11:00:00 | | day | 截断到天作为有效时间 | 2020-11-04 11:12:05 => 2020-11-04 00:00:00 | | month | 截断到当月第一天作为有效时间 | 2020-11-04 11:12:51 => 2020-11-01 00:00:00 | | year | 截断到当年第一天作为有效时间 | 2020-11-04 11:12:00 => 2020-01-01 00:00:00 | | week | 截断到这个星期第一天作为有效时间 | 2020-11-04 11:12:00 => 2020-11-02 00:00:00 | | quarter | 截断到这个季度第一天作为有效时间 | 2020-06-23 11:12:00 => 2020-04-01 00:00:00 | **函数实现** 对于date\_trunc的实现,可以简单地分两步做: 1: 把datetime拆解成各个部分(年月日/是分秒),然后提取所需要的部分。 2: 根据所需要的部分组合为一个新的datetime。 对于week/quarter的情况需要做特殊计算。 需要研究下snowflake的week。 snowflake中可以设置一周的第一天。 alter session set week\_start = 0和alter session set week\_start = 1和默认一样把周一作为一周第一天。 alter session set week\_start = 3,把周三作为一周的第一天。 <br> #### 7.2.1.32 time_to_sec **函数定义** ~~~ text INT time_to_sec(DATETIME date) ~~~ 函数返回将参数time 转换为秒数的时间值,转换公式为 小时\* 3600+ 分钟\*60+ 秒 **示例** ~~~text mysql> select time_to_sec('12:13:14'); +-----------------------------+ | time_to_sec('12:13:14') | +-----------------------------+ | 43994 | +-----------------------------+ ~~~ **关键字** `time_to_sec`