SQL 入门
SQL 简介
SQL 语法
SQL 通用数据类型
SQL 语句快速参考
SQL Select 语句
SQL SELECT DISTINCT 语句
SQL Where 子句
SQL AND & OR 运算符
SQL ORDER BY 关键字
SQL INSERT INTO 语句
SQL Update 语句
SQL Delete 语句
SQL SELECT TOP, LIMIT, ROWNUM
SQL LIKE 操作符
SQL 通配符
SQL IN 操作符
SQL BETWEEN 操作符
SQL Join连接
SQL INNER JOIN 关键字
SQL LEFT JOIN 关键字
SQL RIGHT JOIN 关键字
SQL FULL OUTER JOIN 关键字
SQL UNION 操作符
SQL SELECT INTO 语句
SQL INSERT INTO SELECT 语句
SQL 高级教程
SQL 撤销索引、表以及数据库
SQL CREATE DATABASE 语句
SQL CREATE TABLE 语句
SQL ALTER TABLE 语句
SQL AUTO INCREMENT 字段
SQL CREATE VIEW、REPLACE VIEW、 DROP VIEW 语句
SQL Server 和 MySQL 中的 Date 函数
SQL NULL 值 – IS NULL 和 IS NOT NULL
SQL 进阶
SQL 别名
SQL 约束
SQL NOT NULL 约束
SQL UNIQUE 约束
SQL PRIMARY KEY 约束
SQL FOREIGN KEY 约束
SQL DEFAULT 约束
SQL CHECK 约束
SQL 使用连接
SQL UNION 子句
SQL NULL 值
SQL 克隆数据表
SQL 索引
SQL 子查询
SQL ALTER TABLE 命令
SQL TRUNCATE TABLE 命令
SQL 处理重复数据
SQL 使用视图
SQL 注入
SQL HAVING 子句
SQL 事务
SQL 使用序列
SQL 通配符
SQL 临时表
SQL MS Access、MySQL 和 SQL Server 数据类型
SQL 函数
SQL 日期函数
SQL 函数
SQL AVG() 函数
SQL COUNT() 函数
SQL FIELD()函数
SQL FIRST() 函数
SQL LAST() 函数
SQL MAX() 函数
SQL MIN() 函数
SQL SUM() 函数
SQL GROUP BY 语句
SQL HAVING 子句
SQL UPPER(),LOWER()函数
SQL UPPER()函数
SQL LOWER()函数
SQL UCASE() 函数
SQL LCASE() 函数
SQL MID() 函数
SQL LEN() 函数
SQL ROUND() 函数
SQL NOW() 函数
SQL FORMAT() 函数
SQL SQRT() 函数
SQL RAND() 函数
SQL CONCAT() 函数
SQL ISNULL()、NVL()、IFNULL() 和 COALESCE() 函数
SQL REPLACE()函数
SQL TRIM()函数
SQL 日期函数 - SQL教程 - 光年文档管理系统(Light Year Doc)
网站首页
SQL 日期函数
## 日期函数列表 下面的列表中是 SQL 中所有与日期和时间相关的重要函数。你所用的 RDBMS 可能会支持更多其他的函数。下面的列表基于 MySQL 关系型数据库管理系统。 | 名称 | 描述 | | --- | --- | | ADDDATE() | 增加日期 | | ADDTIME() | 增加时间 | | CONVERT_TZ() | 将当前时区更改为另一时区 | | CURDATE() | 返回当前日期 | | CURRENT_DATE(), CURRENT_DATE | CURDATE() 的别名 | | CURRENT_TIME(), CURRENT_TIME | CURTIME() 的别名 | | CURRENT_TIMESTAMP(), CURRENT_TIMESTAMP | NOW() 的别名 | | CURTIME() | 返回当前时间 | | DATE_ADD() | 将两个日期相加 | | DATE_FORMAT() | 按照指定格式格式化日期 | | DATE_SUB() | 将两个日期相减 | | DATE() | 从 date 或者 datetime 表达式中提取出日期部分 | | DATEDIFF() | 将两个日期相减 | | DAY() | DAYOFMONTH() 的别名 | | DAYNAME() | 返回某天在用星期中的名称 | | DAYOFMONTH() | 返回某天是当月的第几天 (1-31) | | DAYOFWEEK() | 返回某天是该星期的第几天 | | DAYOFYEAR() | 返回某天是一年中的第几天(1-366) | | EXTRACT | 提取日期中的某一部分 | | FROM_DAYS() | 将天数转换为日期 | | FROM_UNIXTIME() | 将某个日期格式化为 UNIX 时间戳 | | HOUR() | 提取小时 | | LAST_DAY | 返回参数日期所在月份的最后一天 | | LOCALTIME(), LOCALTIME | NOW() 的别名 | | LOCALTIMESTAMP, LOCALTIMESTAMP() | NOW() 的别名 | | MAKEDATE() | 利用年份和某天在该年所处的天数来创建日期 | | MAKETIME | MAKETIME() | | MICROSECOND() | 由参数返回微秒 | | MINUTE() | 由参数返回分钟 | | MONTH() | 返回日期参数的月份 | | MONTHNAME() | 返回月份的名字 | | NOW() | 返回当前日期和时间 | | PERIOD_ADD() | 向年月格式的日期数据之间添加一段时间 | | PERIOD_DIFF() | 返回两个年月格式的日期数据之间的月份数 | | QUARTER() | 返回日期参数所在的季度 | | SEC_TO_TIME() | 将秒数转换为 'HH:MM:SS' 格式 | | SECOND() | 返回参数中的秒数 (0-59) | | STR_TO_DATE() | 将字符串转换为日期数据 | | SUBDATE() | 以三个参数调用的时候是 DATE_SUB() 的同义词 | | SUBTIME() | 减去时间 | | SYSDATE() | 返回函数执行的时的时刻 | | TIME_FORMAT() | 格式化时间 | | TIME_TO_SEC() | 将时间参数转换为秒数 | | TIME() | 返回参数表达式中的时间部分 | | TIMEDIFF() | 将两个时间相减 | | TIMESTAMP() | 只有一个参数时,该函数返回 date 或者 datetime 表达式。当有两个参数时,将两个参数相加。 | | TIMESTAMPADD() | 在 datetime 表达式上加上一段时间 | | TIMESTAMPDIFF() | 在 datetime 表达式上减去一段时间 | | TO_DAYS() | 将日期参数转换为天数 | | UNIX_TIMESTAMP() | 返回 UNIX 时间戳 | | UTC_DATE() | 返回当前 UTC 日期 | | UTC_TIME() | 返回当前 UTC 时间 | | UTC_TIMESTAMP() | 返回当前 UTC 日期和时间 | | WEEK() | 返回参数的星期数 | | WEEKDAY() | 返回日期参数时一个星期中的第几天 | | WEEKOFYEAR() | 返回日期参数是日历上的第几周 (1-53) | | YEAR() | 返回日期参数中的年份 | | YEARWEEK() | 返回年份和星期 | ## 日期函数实例 ### ADDDATE(date, INTERVAL expr unit), ADDDATE(expr, days) 如果调用时第二个参数为 INTERVAL 形式的话,ADDDATE() 就是 DATE_ADD() 的同义词。同样的情况下,SUBDATE() 是 DATE_SUB() 的同义词。有关 INTERVAL 单位参数的信息,见有关 DATE_ADD() 的讨论。 ```sql mysql> SELECT DATE_ADD('1998-01-02', INTERVAL 31 DAY); +---------------------------------------------------------+ | DATE_ADD('1998-01-02', INTERVAL 31 DAY) | +---------------------------------------------------------+ | 1998-02-02 | +---------------------------------------------------------+ 1 row in set (0.00 sec) mysql> SELECT ADDDATE('1998-01-02', INTERVAL 31 DAY); +---------------------------------------------------------+ | ADDDATE('1998-01-02', INTERVAL 31 DAY) | +---------------------------------------------------------+ | 1998-02-02 | +---------------------------------------------------------+ 1 row in set (0.00 sec) ``` 如果调用时第二个参数为天数形式的话,则 MySQL 会将其作为整数加到 expr 上。 ```sql mysql> SELECT ADDDATE('1998-01-02', 31); +---------------------------------------------------------+ | DATE_ADD('1998-01-02', INTERVAL 31 DAY) | +---------------------------------------------------------+ | 1998-02-02 | +---------------------------------------------------------+ 1 row in set (0.00 sec) ``` ### ADDTIME(expr1,expr2) ADDTIME() 将 expr2 加到 expr1 上,并返回结果。expr1 为 time 或者 datetime 表达式,expr2 为 time 表达式。 ```sql mysql> SELECT ADDTIME('1997-12-31 23:59:59.999999','1 1:1:1.000002'); +---------------------------------------------------------+ | DATE_ADD('1997-12-31 23:59:59.999999','1 1:1:1.000002') | +---------------------------------------------------------+ | 1998-01-02 01:01:01.000001 | +---------------------------------------------------------+ 1 row in set (0.00 sec) ``` ### CONVERT_TZ(dt,from_tz,to_tz) 该函数将 datetime 类型的值 dt 的时区从 from_dt 转换为 to_dt,并返回结果。如果参数无效,则函数返回 NULL。 ```sql mysql> SELECT CONVERT_TZ('2004-01-01 12:00:00','GMT','MET'); +---------------------------------------------------------+ | CONVERT_TZ('2004-01-01 12:00:00','GMT','MET') | +---------------------------------------------------------+ | 2004-01-01 13:00:00 | +---------------------------------------------------------+ 1 row in set (0.00 sec) mysql> SELECT CONVERT_TZ('2004-01-01 12:00:00','+00:00','+10:00'); +---------------------------------------------------------+ | CONVERT_TZ('2004-01-01 12:00:00','+00:00','+10:00') | +---------------------------------------------------------+ | 2004-01-01 22:00:00 | +---------------------------------------------------------+ 1 row in set (0.00 sec) ``` ### CURDATE() 以 'YYYY-MM-DD'(字符串) 或者 YYYYMMDD(数值) 的形式返回当前日期, 具体形式取决于函数处于字符串还是数值型的上下文环境中。 ```sql mysql> SELECT CURDATE(); +---------------------------------------------------------+ | CURDATE() | +---------------------------------------------------------+ | 1997-12-15 | +---------------------------------------------------------+ 1 row in set (0.00 sec) mysql> SELECT CURDATE() + 0; +---------------------------------------------------------+ | CURDATE() + 0 | +---------------------------------------------------------+ | 19971215 | +---------------------------------------------------------+ 1 row in set (0.00 sec) ``` ### CURRENT_DATE and CURRENT_DATE() CURRENT_DATE 和 CURRENT_DATE() 是 CURDATE() 的别名。 ### CURTIME() 以 'HH:MM:SS'(字符串) 或者 HHMMSS(数值) 的形式返回当前时间, 具体形式取决于函数处于字符串还是数值型的上下文环境中。该函数按照当前时区来表示返回值。 ```sql mysql> SELECT CURTIME(); +---------------------------------------------------------+ | CURTIME() | +---------------------------------------------------------+ | 23:50:26 | +---------------------------------------------------------+ 1 row in set (0.00 sec) mysql> SELECT CURTIME() + 0; +---------------------------------------------------------+ | CURTIME() + 0 | +---------------------------------------------------------+ | 235026 | +---------------------------------------------------------+ 1 row in set (0.00 sec) ``` ### CURRENT_TIME and CURRENT_TIME() CURRENT_TIME 和 CURRENT_TIME() 是 CURTIME() 的别名。 ### CURRENT_TIMESTAMP and CURRENT_TIMESTAMP() CURRENT_TIMESTAMP 和 CURRENT_TIMESTAMP() 是 NOW() 的别名。 ### DATE(expr) 提取 date 表达式或者 datetime 表达式中的日期部分。 ```sql mysql> SELECT DATE('2003-12-31 01:02:03'); +---------------------------------------------------------+ | DATE('2003-12-31 01:02:03') | +---------------------------------------------------------+ | 2003-12-31 | +---------------------------------------------------------+ 1 row in set (0.00 sec) ``` ### DATEDIFF(expr1,expr2) DATEDIFF() 返回 expr1 和 expr2 的差,以天数的形式表示。expr1 和 expr2 应为 date 或者 datetime 表达式。只有参数的日期部分参与了计算。 ```sql mysql> SELECT DATEDIFF('1997-12-31 23:59:59','1997-12-30'); +---------------------------------------------------------+ | DATEDIFF('1997-12-31 23:59:59','1997-12-30') | +---------------------------------------------------------+ | 1 | +---------------------------------------------------------+ 1 row in set (0.00 sec) ``` ### DATE_ADD(date,INTERVAL expr unit), DATE_SUB(date,INTERVAL expr unit) 这些函数进行有关日期的算术运算。date 是一个 DATETIME 或者 DATE 类型的值,指明了起始时间。expr 表达式则是 date 要增加或者减去的时间间隔。expr 是一个字符串,可以以 '-' 开始来表示负时间区间。 unit 是一个关键词,指明了expr 的单位。 INTERVAL 关键字和 unit(单位)指示符不区分大小写。 下表列出了对于每种单位,expr 应有的形式。 | unit 值 | expr 应有的格式 | | --- | --- | | MICROSECOND | 微秒 | | SECOND | 秒 | | MINUTE | 分钟 | | HOUR | 小时 | | DAY | 天 | | WEEK | 星期 | | MONTH | 月 | | QUARTER | 季度 | | YEAR | 年 | | SECOND_MICROSECOND | '秒.微秒' | | MINUTE_MICROSECOND | '分.微秒' | | MINUTE_SECOND | '分:秒' | | HOUR_MICROSECOND | '小时.微秒' | | HOUR_SECOND | '时:分:秒' | | HOUR_MINUTE | '时:分' | | DAY_MICROSECOND | '天.微秒' | | DAY_SECOND | '天 时:分:秒' | | DAY_MINUTE | '天 时:分' | | DAY_HOUR | '天 时' | | YEAR_MONTH | '年-月' | QUARTER 和 WEEK 自 MySQL 5.0.0 起受到支持。 ```sql mysql> SELECT DATE_ADD('1997-12-31 23:59:59', -> INTERVAL '1:1' MINUTE_SECOND); +---------------------------------------------------------+ | DATE_ADD('1997-12-31 23:59:59', INTERVAL... | +---------------------------------------------------------+ | 1998-01-01 00:01:00 | +---------------------------------------------------------+ 1 row in set (0.00 sec) mysql> SELECT DATE_ADD('1999-01-01', INTERVAL 1 HOUR); +---------------------------------------------------------+ | DATE_ADD('1999-01-01', INTERVAL 1 HOUR) | +---------------------------------------------------------+ | 1999-01-01 01:00:00 | +---------------------------------------------------------+ 1 row in set (0.00 sec) ``` ### DATE_FORMAT(date,format) 根据格式字符串对日期值进行格式化。 下面这些占位符可以用在格式字符串中,'%' 必须出现在特定的格式字符之前。 | 占位符 | 描述 | | --- | --- | | %a | 简写的星期名称(Sun..Sat) | | %b | 简写的月份名称 (Jan..Dec) | | %c | 月份,以数值形式表示(0..12) | | %D | 月份中的日期,带有英文后缀(0th,1st,2nd,3rd 等等) | | %d | 月份中的日期,以数值表示 (00..31) | | %e | 月份中的日期,以数值表示 (0..31) | | %f | 微秒(000000..999999) | | %H | 小时(00..23) | | %h | 小时(01..12) | | %I | 小时(01..12) | | %i | 分钟,以数值表示(00..59) | | %j | 一年中的第几天(001..366) | | %k | 小时(0..23) | | %l | 小时(1..12) | | %M | 月份的名称(January..December) | | %m | 月份,以数值形式表示(00..12) | | %p | AM 或者 PM | | %r | 时间,12 小时制(hh:mm:ss followed by AM or 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 | 一周中日期的名称(Sunday..Saturday) | | %w | 一周中的第几天(0=Sunday..6=Saturday) | | %X | 以星期日为第一天的周所处的年份,四位数字表示;同 %V 一起使用。 | | %x | 以星期一为第一天的周所处的年份,四位数字表示;同 %v 一起使用。 | | %Y | 年份,四位数字表示。 | | %y | 年份,两位数字表示。 | | %% | % 字面值 | | %x | x,针对任何以上没有列出的情况。 | ```sql mysql> SELECT DATE_FORMAT('1997-10-04 22:23:00', '%W %M %Y'); +---------------------------------------------------------+ | DATE_FORMAT('1997-10-04 22:23:00', '%W %M %Y') | +---------------------------------------------------------+ | Saturday October 1997 | +---------------------------------------------------------+ 1 row in set (0.00 sec) 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....... | +---------------------------------------------------------+ | 22 22 10 10:23:00 PM 22:23:00 00 6 | +---------------------------------------------------------+ 1 row in set (0.00 sec) ``` ### DATE_SUB(date,INTERVAL expr unit) 同 DATE_ADD() 函数相似。 ### DAY(date) DAY() 是 DAYOFMONTH() 的别名。 ### DAYNAME(date) 返回 date 在星期中的名称。 ```sql mysql> SELECT DAYNAME('1998-02-05'); +---------------------------------------------------------+ | DAYNAME('1998-02-05') | +---------------------------------------------------------+ | Thursday | +---------------------------------------------------------+ 1 row in set (0.00 sec) ``` ### DAYOFMONTH(date) 返回 date 是当月的第几天,范围为 0 到 31。 ```sql mysql> SELECT DAYOFMONTH('1998-02-03'); +---------------------------------------------------------+ | DAYOFMONTH('1998-02-03') | +---------------------------------------------------------+ | 3 | +---------------------------------------------------------+ 1 row in set (0.00 sec) ``` ### DAYOFWEEK(date) 返回 date 是其所在星期的第几天(1 = Sunday, 2 = Monday,.., 7 = Saturday),这里一星期中日期的名称与数字的对应关系符合 ODBC 标准。 ```sql mysql> SELECT DAYOFWEEK('1998-02-03'); +---------------------------------------------------------+ |DAYOFWEEK('1998-02-03') | +---------------------------------------------------------+ | 3 | +---------------------------------------------------------+ 1 row in set (0.00 sec) ``` ### DAYOFYEAR(date) 返回 date 是当年的第几天,范围为 1 到 366。 ```sql mysql> SELECT DAYOFYEAR('1998-02-03'); +---------------------------------------------------------+ | DAYOFYEAR('1998-02-03') | +---------------------------------------------------------+ | 34 | +---------------------------------------------------------+ 1 row in set (0.00 sec) ``` ### EXTRACT(unit FROM date) EXTRACT() 与 DATE_ADD() 和 DATE_SUB() 使用相同的表示单位的占位符,其作用是提取日期值中相应的组成部分,而不是进行日期运算。 ```sql mysql> SELECT EXTRACT(YEAR FROM '1999-07-02'); +---------------------------------------------------------+ | EXTRACT(YEAR FROM '1999-07-02') | +---------------------------------------------------------+ | 1999 | +---------------------------------------------------------+ 1 row in set (0.00 sec) mysql> SELECT EXTRACT(YEAR_MONTH FROM '1999-07-02 01:02:03'); +---------------------------------------------------------+ | EXTRACT(YEAR_MONTH FROM '1999-07-02 01:02:03') | +---------------------------------------------------------+ | 199907 | +---------------------------------------------------------+ 1 row in set (0.00 sec) ``` ### FROM_DAYS(N) 给出天数 N,返回 DATE 值。 ```sql mysql> SELECT FROM_DAYS(729669); +---------------------------------------------------------+ | FROM_DAYS(729669) | +---------------------------------------------------------+ | 1997-10-07 | +---------------------------------------------------------+ 1 row in set (0.00 sec) ``` 在使用 FROM_DAYS() 处理比较老的日期的时候应当特别小心,该函数不适用于格里高利历诞生(1582)之前的日期。 ### FROM_UNIXTIME(unix_timestamp), FROM_UNIXTIME(unix_timestamp,format) 返回 UNIX 时间戳对应的日期值,根据函数所处的上下文环境不同,返回值得格式也不同,字符串上下文返回格式为 'YYYY-MM-DD HH:MM:SS',数值型上下文返回格式则为 YYYYMMDDHHMMSS。返回值的时区为系统当前时区。UNIX 时间戳是一种系统内部时间表示,例如 UNIX_TIMESTAMP() 的返回值。 如果给定格式的话,返回结果将会根据格式字符串进行格式化,其规则同 DATE_FORMAT() 函数。 ```sql mysql> SELECT FROM_UNIXTIME(875996580); +---------------------------------------------------------+ | FROM_UNIXTIME(875996580) | +---------------------------------------------------------+ | 1997-10-04 22:23:00 | +---------------------------------------------------------+ 1 row in set (0.00 sec) ``` ### HOUR(time) 返回时间值的小时部分。对于一天中的时间来说,返回值的范围为 0 到 23。不过,TIME 类型的值可以大得多,所以 HOUR 函数可以返回比 23 大的值。 ```sql mysql> SELECT HOUR('10:05:03'); +---------------------------------------------------------+ | HOUR('10:05:03') | +---------------------------------------------------------+ | 10 | +---------------------------------------------------------+ 1 row in set (0.00 sec) ``` ### LAST_DAY(date) 返回 date 或者 datetime 值所在月份的最后一天。如果参数无效的话,返回 NULL。 ```sql mysql> SELECT LAST_DAY('2003-02-05'); +---------------------------------------------------------+ | LAST_DAY('2003-02-05') | +---------------------------------------------------------+ | 2003-02-28 | +---------------------------------------------------------+ 1 row in set (0.00 sec) ``` ### LOCALTIME and LOCALTIME() LOCALTIME 和 LOCALTIME() 是 NOW() 的别名。 ### LOCALTIMESTAMP and LOCALTIMESTAMP() LOCALTIMESTAMP 和 LOCALTIMESTAMP() 是 NOW() 的别名。 ### MAKEDATE(year,dayofyear) 给定年份和(某天在一年中)的天数,返回对应的日期值。天数必须大于 0,否则返回值为 NULL。 ```sql mysql> SELECT MAKEDATE(2001,31), MAKEDATE(2001,32); +---------------------------------------------------------+ | MAKEDATE(2001,31), MAKEDATE(2001,32) | +---------------------------------------------------------+ | '2001-01-31', '2001-02-01' | +---------------------------------------------------------+ 1 row in set (0.00 sec) ``` ### MAKETIME(hour,minute,second) 根据参数给出的时、分、秒,返回对应的时间值。 ```sql mysql> SELECT MAKETIME(12,15,30); +---------------------------------------------------------+ | MAKETIME(12,15,30) | +---------------------------------------------------------+ | '12:15:30' | +---------------------------------------------------------+ 1 row in set (0.00 sec) ``` ### MICROSECOND(expr) 根据 time 或者 datetime 表达式 expr,返回微秒数,结果在 0 到 999999 之间。 ```sql mysql> SELECT MICROSECOND('12:00:00.123456'); +---------------------------------------------------------+ | MICROSECOND('12:00:00.123456') | +---------------------------------------------------------+ | 123456 | +---------------------------------------------------------+ 1 row in set (0.00 sec) ``` ### MINUTE(time) 返回时间型值中的分钟部分,范围为 0 到 59。 ```sql mysql> SELECT MINUTE('98-02-03 10:05:03'); +---------------------------------------------------------+ | MINUTE('98-02-03 10:05:03') | +---------------------------------------------------------+ | 5 | +---------------------------------------------------------+ 1 row in set (0.00 sec) ``` ### MONTH(date) 返回日期型值中的月份,范围为 0 到 12。 ```sql mysql> SELECT MONTH('1998-02-03') +---------------------------------------------------------+ | MONTH('1998-02-03') | +---------------------------------------------------------+ | 2 | +---------------------------------------------------------+ 1 row in set (0.00 sec) ``` ### MONTHNAME(date) 返回日期型值所处月份的全名。 ```sql mysql> SELECT MONTHNAME('1998-02-05'); +---------------------------------------------------------+ | MONTHNAME('1998-02-05') | +---------------------------------------------------------+ | February | +---------------------------------------------------------+ 1 row in set (0.00 sec) ``` ### NOW() 返回当前的日期和时间,结果的格式为 'YYYY-MM-DD HH:MM:SS' 或者 YYYYMMDDHHMMSS,如果函数上下文环境为字符型,则返回前者,否则如果函数处于数值型的上下文环境,则返回后者。返回值的时区为系统当前时区。 ```sql mysql> SELECT NOW(); +---------------------------------------------------------+ | NOW() | +---------------------------------------------------------+ | 1997-12-15 23:50:26 | +---------------------------------------------------------+ 1 row in set (0.00 sec) ``` ### PERIOD_ADD(P,N) 在时间 P(格式为 YYMM 或者 YYYYMM)上加上 N 个月,结果格式为 YYYYMM。注意,时间参数 P 并不是日期型值。 ```sql mysql> SELECT PERIOD_ADD(9801,2); +---------------------------------------------------------+ | PERIOD_ADD(9801,2) | +---------------------------------------------------------+ | 199803 | +---------------------------------------------------------+ 1 row in set (0.00 sec) ``` ### PERIOD_DIFF(P1,P2) 返回时间 P1 和 P2 之间相差的月份。 P1 和 P2 的格式应为 YYMM 或者 YYYYMM。注意I,P1 和 P2 不是日期型值。 ```sql mysql> SELECT PERIOD_DIFF(9802,199703); +---------------------------------------------------------+ | PERIOD_DIFF(9802,199703) | +---------------------------------------------------------+ | 11 | +---------------------------------------------------------+ 1 row in set (0.00 sec) ``` ### QUARTER(date) 返回日期型值 date 所处的季度值,范围为 1 到 4。 ```sql mysql> SELECT QUARTER('98-04-01'); +---------------------------------------------------------+ | QUARTER('98-04-01') | +---------------------------------------------------------+ | 2 | +---------------------------------------------------------+ 1 row in set (0.00 sec) ``` ### SECOND(time) 返回时间型值中秒的部分,范围为 0 到 59。 ```sql mysql> SELECT SECOND('10:05:03'); +---------------------------------------------------------+ | SECOND('10:05:03') | +---------------------------------------------------------+ | 3 | +---------------------------------------------------------+ 1 row in set (0.00 sec) ``` ### SEC_TO_TIME(seconds) 将参数中的秒数转换为时分秒的格式 'HH:MM:SS' 或者 HHMMSS,如果函数所处的上下文为字符串型,则返回前者,否则如果上下文环境为数值型,则返回后者。 ### STR_TO_DATE(str,format) 这是 DATE_FORMATE() 函数的逆函数,其参数为表示时间和日期的字符串 str 和一个格式字符串 format。如果格式字符串中既有日期又有时间,则 STR_TO_DATE() 返回 DATETIME() 型的值,否则返回日期型(DATE)或者时间型(TIME)的值。 ```sql mysql> SELECT STR_TO_DATE('04/31/2004', '%m/%d/%Y'); +---------------------------------------------------------+ | STR_TO_DATE('04/31/2004', '%m/%d/%Y') | +---------------------------------------------------------+ | 2004-04-31 | +---------------------------------------------------------+ 1 row in set (0.00 sec) ``` ### SUBDATE(date,INTERVAL expr unit) and SUBDATE(expr,days) 当第二个参数为 INTERVAL 形式时,SUBDATE() 就是 DATE_SUB() 的别名。INTERVAL 参数中单位的信息,请见有关 DATE_ADD() 的讨论。 ```sql mysql> SELECT DATE_SUB('1998-01-02', INTERVAL 31 DAY); +---------------------------------------------------------+ | DATE_SUB('1998-01-02', INTERVAL 31 DAY) | +---------------------------------------------------------+ | 1997-12-02 | +---------------------------------------------------------+ 1 row in set (0.00 sec) mysql> SELECT SUBDATE('1998-01-02', INTERVAL 31 DAY); +---------------------------------------------------------+ | SUBDATE('1998-01-02', INTERVAL 31 DAY) | +---------------------------------------------------------+ | 1997-12-02 | +---------------------------------------------------------+ 1 row in set (0.00 sec) ``` ### SUBTIME(expr1,expr2) SUBTIME() 返回 expr1-expr2,结果的格式与 expr1 相同。expr1 是一个时间型(time)或者 datetime 型的表达式,expr2 是时间型值。 ### SYSDATE() 返回当前的日期和时间,格式为 'YYYY-MM-DD HH:MM:SS' 或 YYYYMMDDHHMMSS,如果函数所处的上下文环境为字符串,则返回前者,否则如果上下文环境为数值型,则返回后者。 ```sql mysql> SELECT SYSDATE(); +---------------------------------------------------------+ | SYSDATE() | +---------------------------------------------------------+ | 2006-04-12 13:47:44 | +---------------------------------------------------------+ 1 row in set (0.00 sec) ``` ### TIME(expr) 提取时间型或者 datetime 型表达式 expr 中的时间部分,返回结果为字符串。 ```sql mysql> SELECT TIME('2003-12-31 01:02:03'); +---------------------------------------------------------+ | TIME('2003-12-31 01:02:03') | +---------------------------------------------------------+ | 01:02:03 | +---------------------------------------------------------+ 1 row in set (0.00 sec) ``` ### TIMEDIFF(expr1,expr2) TIMEDIFF() 返回 expr1-expr2,结果为时间型值。expr1 和 expr2 可以为时间型或者 datetime 型表达式,不过二者必须为相同类型。 ```sql mysql> SELECT TIMEDIFF('1997-12-31 23:59:59.000001', -> '1997-12-30 01:01:01.000002'); +---------------------------------------------------------+ | TIMEDIFF('1997-12-31 23:59:59.000001'..... | +---------------------------------------------------------+ | 46:58:57.999999 | +---------------------------------------------------------+ 1 row in set (0.00 sec) ``` ### TIMESTAMP(expr), TIMESTAMP(expr1,expr2) 只有一个参数的时候,该函数由日期型或者 datetime 型表达式返回一个 datetime 型值。有两个参数的时候,该函数将 expr2 加到日期型或 datetime 型值 expr1 上,并返回 datetime 型的结果。 ```sql mysql> SELECT TIMESTAMP('2003-12-31'); +---------------------------------------------------------+ | TIMESTAMP('2003-12-31') | +---------------------------------------------------------+ | 2003-12-31 00:00:00 | +---------------------------------------------------------+ 1 row in set (0.00 sec) ``` ### TIMESTAMPADD(unit,interval,datetime_expr) 将整数型的表达式 interval 加到日期型或者 datetime 型表达式 datetime_expr 上。单位由 unit 参数给出,其取值应为以下几种中的一种:FRAC_SECOND、SECOND、MINUTE、HOUR、DAY、WEEK、MONTH、QUARTER 或者 YEAR。 单位 unit 可以为上述关键字中的一个,也可以添加一个 SQL*TSI* 前缀,例如 DAY 和 SQL_TSI_DAY 都是合法的。 ```sql mysql> SELECT TIMESTAMPADD(MINUTE,1,'2003-01-02'); +---------------------------------------------------------+ | TIMESTAMPADD(MINUTE,1,'2003-01-02') | +---------------------------------------------------------+ | 2003-01-02 00:01:00 | +---------------------------------------------------------+ 1 row in set (0.00 sec) ``` ### TIMESTAMPDIFF(unit,datetime_expr1,datetime_expr2) 返回日期型或者 datetime 型表达式 datetime_expr1 和 datetime_expr2 的差。结果的单位由 unit 参数给出,unit 的取值规定同 TIMESTAMPADD() 函数。 ```sql mysql> SELECT TIMESTAMPDIFF(MONTH,'2003-02-01','2003-05-01'); +---------------------------------------------------------+ | TIMESTAMPDIFF(MONTH,'2003-02-01','2003-05-01') | +---------------------------------------------------------+ | 3 | +---------------------------------------------------------+ 1 row in set (0.00 sec) ``` ### TIME_FORMAT(time,format) 该函数使用起来类似 DATE_FORMAT() 函数,但是格式字符串 format 中只能有与小时、分钟和秒有关的那些占位符。 如果时间型值的小时部分大于 23,则 %H 和 %k 格式占位符将会产生一个大于通常的 0-23 的值,其他与小时有关的占位符则会返回小时值除以 12 后的余数(modulo 12)。 ```sql mysql> SELECT TIME_FORMAT('100:00:00', '%H %k %h %I %l'); +---------------------------------------------------------+ | TIME_FORMAT('100:00:00', '%H %k %h %I %l') | +---------------------------------------------------------+ | 100 100 04 04 4 | +---------------------------------------------------------+ 1 row in set (0.00 sec) ``` ### TIME_TO_SEC(time) 将时间型值转换为秒。 ```sql mysql> SELECT TIME_TO_SEC('22:23:00'); +---------------------------------------------------------+ | TIME_TO_SEC('22:23:00') | +---------------------------------------------------------+ | 80580 | +---------------------------------------------------------+ 1 row in set (0.00 sec)、 ``` ### TO_DAYS(date) 给定日期型值 date,返回天数(自公元 0 年以来的天数)。 ```sql mysql> SELECT TO_DAYS(950501); +---------------------------------------------------------+ | TO_DAYS(950501) | +---------------------------------------------------------+ | 728779 | +---------------------------------------------------------+ 1 row in set (0.00 sec) ``` ### UNIX_TIMESTAMP(), UNIX_TIMESTAMP(date) 不带任何参数时,该函数返回一个 unsigned integer 型的 UNIX 时间戳(自 '1970-01-01 00:00:00' UTC 以来的秒数)。如果有一个参数 date 的话,该函数返回自 '1970-01-01 00:00:00' UTC 至 date 的秒数。date 可以是日期型的字符串、DATETIME 型的字符串、时间戳或者 YYMMDD 或 YYYYMMDD 格式的数字。 ```sql mysql> SELECT UNIX_TIMESTAMP(); +---------------------------------------------------------+ | UNIX_TIMESTAMP() | +---------------------------------------------------------+ | 882226357 | +---------------------------------------------------------+ 1 row in set (0.00 sec) mysql> SELECT UNIX_TIMESTAMP('1997-10-04 22:23:00'); +---------------------------------------------------------+ | UNIX_TIMESTAMP('1997-10-04 22:23:00') | +---------------------------------------------------------+ | 875996580 | +---------------------------------------------------------+ 1 row in set (0.00 sec) ``` ### UTC_DATE, UTC_DATE() 返回当前 UTC 日期,格式为 'YYYY-MM-DD' 或者 YYYYMMDD,如果函数所处的上下文环境为字符串,则返回前者,否则如果上下文环境为数值型的,则返回后者。 ```sql mysql> SELECT UTC_DATE(), UTC_DATE() + 0; +---------------------------------------------------------+ | UTC_DATE(), UTC_DATE() + 0 | +---------------------------------------------------------+ | 2003-08-14, 20030814 | +---------------------------------------------------------+ 1 row in set (0.00 sec) ``` ### UTC_TIME, UTC_TIME() 返回当前 UTC 时间,格式为 'HH:MM:SS' 或者 HHMMSS,如果函数所处的上下文环境为字符串,则返回前者,否则如果上下文环境为数值型的,则返回后者。 ```sql mysql> SELECT UTC_TIMESTAMP(), UTC_TIMESTAMP() + 0; +---------------------------------------------------------+ | UTC_TIMESTAMP(), UTC_TIMESTAMP() + 0 | +---------------------------------------------------------+ | 2003-08-14 18:08:04, 20030814180804 | +---------------------------------------------------------+ 1 row in set (0.00 sec) ``` ### WEEK(date[,mode]) 该函数将返回 date 所在的周是当年的第几周。两个参数的 WEEK() 函数的使你能够指明一周起始于周日还是周一,以及返回值的范围应该是 0 到 53,还是 1 到 53。如果 mode 参数被忽略,则将使用 default_week_format 系统变量。 | Mode | 一周的第一天 | 范围 | 周 1 是第一周 | | --- | --- | --- | --- | | 0 | Sunday | 0-53 | 该年包括一个星期天 | | 1 | Monday | 0-53 | 该年包含超过 3 天 | | 2 | Sunday | 1-53 | 该年包括一个星期天 | | 3 | Monday | 1-53 | 该年包含超过 3 天 | | 4 | Sunday | 0-53 | 该年包含超过 3 天 | | 5 | Monday | 0-53 | 该年包括一个星期一 | | 6 | Sunday | 1-53 | 该年包含超过 3 天 | | 7 | Monday | 1-53 | 该年包括一个星期一 | ```sql mysql> SELECT WEEK('1998-02-20'); +---------------------------------------------------------+ | WEEK('1998-02-20') | +---------------------------------------------------------+ | 7 | +---------------------------------------------------------+ 1 row in set (0.00 sec) ``` ### WEEKDAY(date) 返回 date 是其所在星期的第几天 (0 = Monday, 1 = Tuesday,. 6 = Sunday)。 ```sql mysql> SELECT WEEKDAY('1998-02-03 22:23:00'); +---------------------------------------------------------+ | WEEKDAY('1998-02-03 22:23:00') | +---------------------------------------------------------+ | 1 | +---------------------------------------------------------+ 1 row in set (0.00 sec) ``` ### WEEKOFYEAR(date) 返回 date 所在的周是当年的第几周,范围从 1 到 53. WEEKOFYEAR() 是一个兼容性函数,其功能同 WEEK(date, 3)相同。 ```sql mysql> SELECT WEEKOFYEAR('1998-02-20'); +---------------------------------------------------------+ | WEEKOFYEAR('1998-02-20') | +---------------------------------------------------------+ | 8 | +---------------------------------------------------------+ 1 row in set (0.00 sec) ``` ### YEAR(date) 返回 date 的年份部分,范围为 1000 到 9999,对于日期 0 则返回 0。 ```sql mysql> SELECT YEAR('98-02-03'); +---------------------------------------------------------+ | YEAR('98-02-03') | +---------------------------------------------------------+ | 1998 | +---------------------------------------------------------+ 1 row in set (0.00 sec) ``` ### YEARWEEK(date), YEARWEEK(date,mode) 返回 date 所在的年份和周数。mode 参数意义与 WEEK() 函数的完全一样。对于一年中的第一周和最后一周来说,结果中的年份可能会和 date 参数中的年份不同。 ```sql mysql> SELECT YEARWEEK('1987-01-01'); +---------------------------------------------------------+ | YEAR('98-02-03')YEARWEEK('1987-01-01') | +---------------------------------------------------------+ | 198653 | +---------------------------------------------------------+ 1 row in set (0.00 sec) ``` > 注意,这里的周数同 WEEK() 返回的不同,因为 WEEK() 函数的返回值在给定年份的的上下文环境中得出。
上一篇:
SQL 函数
下一篇:
SQL 函数