《MySQL那些与日期和时间相关的函数》由会员分享,可在线阅读,更多相关《MySQL那些与日期和时间相关的函数(4页珍藏版)》请在金锄头文库上搜索。
1、MySQL 那些与日期和时间相关的函数【IT168 技术】日期函数可能是比较常使用的一种函数。下面介绍一些最为常用的日期函数及一些容易忽略的问题。1. NOW、CURRENT_TIMESTAMP 和 SYSDATE这些函数都能返回当前的系统时间,它们之间有区别吗?先来看个例子。mysql SELECT NOW(),CURRENT_TIMESTAMP(),SYSDATE()G;* 1. row *NOW(): 2011-02-04 20:35:04CURRENT_TIMESTAMP(): 2011-02-04 20:35:04SYSDATE(): 2011-02-04 20:35:04从上面的例
2、子看来,3 个函数都是返回当前的系统时间,再来看下面这个例子:mysqlSELECT- NOW(),- CURRENT_TIMESTAMP(),- SYSDATE(),- SLEEP(2),- NOW(),- CURRENT_TIMESTAMP(),- SYSDATE()G* 1. row *NOW(): 2011-11-29 21:04:49CURRENT_TIMESTAMP(): 2011-11-29 21:04:49SYSDATE(): 2011-11-29 21:04:49SLEEP(2): 0NOW(): 2011-11-29 21:04:49CURRENT_TIMESTAMP():
3、 2011-11-29 21:04:49SYSDATE(): 2011-11-29 21:04:511 row in set (2.00 sec)在上面这个例子中人为地加入了 SLEEP 函数,让其等待 2 秒,这时可以发现 SYSDATE 返回的时间和 NOW 及 CURRENT_TIMESTAMP 是不同的,SYSDATE 函数慢了 2 秒。究其原因是这 3 个函数有略微区别:CURRENT_TIMESTAMP 是 NOW 的同义词,也就是说两者是相同的。SYSDATE 函数返回的是执行到当前函数时的时间,而 NOW 返回的是执行 SQL语句时的时间。因此在上面的例子中,两次执行 SYSD
4、ATE 函数返回不同的时间是因为第二次调用执行该函数时等待了前面 SLEEP 函数 2 秒。而对于 NOW 函数,不管是在SLEEP 函数之前还是之后执行,返回的都是执行这条 SQL 语句时的时间。2.时间加减函数先来看一个例子。mysql SELECT NOW(),NOW()+0G;* 1. row *NOW(): 2011-02-04 20:46:33NOW()+0: 20110204204633.0000001 row in set (0.00 sec)可以看到,NOW()函数可以返回时间,也可以返回一个数字,就看用户如何使用。如果相对当前时间进行增加或减少,并不能直接加上或减去一个数字
5、,而需要使用特定的函数,如 DATE_ADD 或 DATE_SUB,前者表示增加,后者表示减少。其具体的使用方法有 DATE_ADD(date,INTERVAL expr unit)和 DATE_SUB(date,INTERVAL expr unit),示例如下:mysql SELECT NOW() AS now,DATE_ADD(now(),INTERVAL 1 DAY) AS tomorrow,DATE_SUB(now(),INTERVAL 1 DAY) AS yesterdayG;* 1. row *now: 2011-02-04 20:53:25tomorrow: 2011-02-05
6、 20:53:25yesterday: 2011-02-03 20:53:251 row in set (0.00 sec)其中 expr 值可以是正值也可以是负值,因此可以使用 DATE_ADD 函数来完成 DATE_SUB 函数的工作,例如:mysql SELECT NOW() AS now,DATE_ADD(NOW(),INTERVAL 1 DAY) AS tomorrow,DATE_ADD(NOW(),INTERVAL -1 DAY) AS yesterdayG;* 1. row *now: 2011-02-04 20:55:40tomorrow: 2011-02-05 20:55:4
7、0yesterday: 2011-02-03 20:55:401 row in set (0.00 sec)还有一个问题,如果是闰月,那么 DATE_ADD 函数怎么处理呢?MySQL 的默认行为是这样的:如果目标年份是闰月,那么返回的日期为 2 月 29 日;如果不是闰月,那么返回日期是 2 月 28 日。示例如下:mysql SELECT DATE_ADD(2000-2-29,INTERVAL 4 YEAR) AS year;+-+| year |+-+| 2004-02-29 |+-+1 row in set (0.00 sec)mysql SELECT DATE_ADD(2000-2-
8、29,INTERVAL 1 YEAR) AS year;+-+| year |+-+| 2001-02-28 |+-+1 row in set (0.00 sec)在上面的例子中使用了 DAY 和 YEAR 数据类型,其实也可以使用MICROSECOND、SECOND、MINUTE、HOUR、WEEK、MONTH 等类型,例如:mysql SELECT NOW() AS now, DATE_ADD(NOW(), INTERVAL 1 HOUR) AS next timeG;* 1. row *now: 2011-02-04 21:00:15next time: 2011-02-04 22:00
9、:151 row in set (0.00 sec)3. DATE_FORMAT 函数这个函数本身没有什么需要探讨的地方,其作用只是按照用户的需求格式化打印出日期,例如:mysql SELECT DATE_FORMAT(NOW(),%Y%m%d) AS datetime;+-+| datetime |+-+| 20110204 |+-+1 row in set (0.00 sec)但是开发人员往往会错误地使用这个函数,导致非常严重的后果。例如在需要查询某一天的数据时,有些开发人员会写如下的语句:SELECT * FROM table WHERE DATE_FORMAT(date,%Y%m%d)
10、=xxxx-xx-xx;一般来说表中都会有一个对日期类型的索引,如果使用上述的语句,优化器绝对不会使用索引,也不可能通过索引来查询数据,因此上述查询的执行效率可能非常低。作者介绍姜承尧(DavidJiang),MySQL 技术内幕:SQL 编程、MySQL 技术内幕:InnoDB 存储引擎作者,资深 MySQL 数据库专家,MySQL 开源分支版本 InnoSQL 的创始人,独立数据库咨询顾问。不仅擅长于数据库的管理和维护,还擅长于数据库的开发,同时一直致力于 MySQL 数据库底层实现原理的研究和探索,对高性能数据库和数据仓库也有深刻而独到的理解。目前就职于网易研究院,担任后台技术中心技术经理一职,从事MySQL 数据库底层以及云的相关的开发工作。本文由 http:/ http:/ 整理