mysql日期和时间函数讲解 1. now、current_timestamp和sysdate 这些函数都能返回当前的系统时间,它们之间有区别吗?先来看个例子。 mysql?select?now(),current_timestamp(),sysdate()\g; ***************************?1. row?*************************** no
mysql日期和时间函数讲解
1. now、current_timestamp和sysdate
这些函数都能返回当前的系统时间,它们之间有区别吗?先来看个例子。
mysql>?select?now(),current_timestamp(),sysdate()\g;
***************************?1. row?***************************
now():?2011-02-04?20:35:04
current_timestamp():?2011-02-04?20:35:04
sysdate():?2011-02-04?20:35:04从上面的例子看来,3个函数都是返回当前的系统时间,再来看下面这个例子:
mysql>select
->?now(),
-> current_timestamp(),
-> sysdate(),
-> sleep(2),
->?now(),
-> current_timestamp(),
-> sysdate()\g
***************************?1. row?***************************
now():?2011-11-29?21:04:49
current_timestamp():?2011-11-29?21:04:49
sysdate():?2011-11-29?21:04:49
sleep(2):?0
now():?2011-11-29?21:04:49
current_timestamp():?2011-11-29?21:04:49
sysdate():?2011-11-29?21:04:51
1?row in?set?(2.00?sec)在上面这个例子中人为地加入了sleep函数,让其等待2秒,这时可以发现sysdate返回的时间和now及current_timestamp是不同的,sysdate函数慢了2秒。究其原因是这3个函数有略微区别:
current_timestamp是now的同义词,也就是说两者是相同的。
sysdate函数返回的是执行到当前函数时的时间,而now返回的是执行sql语句时的时间。
因此在上面的例子中,两次执行sysdate函数返回不同的时间是因为第二次调用执行该函数时等待了前面sleep函数2秒。而对于now函数,不管是在sleep函数之前还是之后执行,返回的都是执行这条sql语句时的时间。
2.时间加减函数
先来看一个例子。
mysql>?select?now(),now()+0\g;
***************************?1. row?***************************
now():?2011-02-04?20:46:33
now()+0:?20110204204633.000000
1?row in?set?(0.00?sec)可以看到,now()函数可以返回时间,也可以返回一个数字,就看用户如何使用。如果相对当前时间进行增加或减少,并不能直接加上或减去一个数字,而需要使用特定的函数,如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?yesterday\g;
***************************?1. row?***************************
now:?2011-02-04?20:53:25
tomorrow:?2011-02-05?20:53:25
yesterday:?2011-02-03?20:53:25
1?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?yesterday\g;
***************************?1. row?***************************
now:?2011-02-04?20:55:40
tomorrow:?2011-02-05?20:55:40
yesterday:?2011-02-03?20:55:40
1?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-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?time\g;
***************************?1. row?***************************
now:?2011-02-04?21:00:15
next?time:?2011-02-04?22:00:15
1?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’)=’xxxx-xx-xx’;
一般来说表中都会有一个对日期类型的索引,如果使用上述的语句,优化器绝对不会使用索引,也不可能通过索引来查询数据,因此上述查询的执行效率可能非常低。
1 楼 hunan84229247 2013-10-08