首页 > MySQL > MySQL 那些你不知道的 时间和日期函数
2009五月18

MySQL 那些你不知道的 时间和日期函数

呃,刚看了一下,貌似MySQL的文章是大家搜索最少的,也是大家评论最少的,

有很多老文章,沙发还都在,嗯。。这是一个问题。。

不过,笔记嘛,自己用的时候翻一翻,就可以啦。呵呵,毕竟不是所有人都不懂这些基础的,

也不是所有人都对这些感兴趣的。嗯。加油,加油,今天继续记录那些MySQL的时间和日期函数。

NOW()函数获得当前的日期和时间:

select now();
/*
+---------------------+
| now()               |
+---------------------+
| 2009-05-18 20:11:24 |
+---------------------+
1 row in set (0.02 sec)
*/

呵,这个函数是我经常用的,没事就看一下当前时间。看离下班还有多久,呵呵。 :cool:

CURTIME()和CURDATE()比NOW()更为具体化,返回当前的时间和日期:

select curtime(),curdate();
/*
+-----------+------------+
| curtime() | curdate()  |
+-----------+------------+
| 20:13:28  | 2009-05-18 |
+-----------+------------+
1 row in set (0.02 sec)
*/

UNIX_TIMESTAMP()函数返回UNIX时间戳:

select unix_timestamp();
/*
+------------------+
| unix_timestamp() |
+------------------+
|       1242648913 |
+------------------+
1 row in set (0.00 sec)
*/

呃,时间戳咋转换为时间呢?难道一定要用PHP的strtotime()?呵,那太麻烦了吧?别急,这就来了。

FROM_UNIXTIME()函数把UNIX时间戳转换为MySQL易读的日期和时间:

select from_unixtime(unix_timestamp());
/*
+---------------------------------+
| from_unixtime(unix_timestamp()) |
+---------------------------------+
| 2009-05-18 20:17:23             |
+---------------------------------+
1 row in set (0.02 sec)
*/

我感觉这个例子,比直接读取一个from_unixtime()更容易让你理解不是吗? :arrow:

YEAR()——年,MONTH(),MONTHNAME()——月,DAYOFYEAR(),DAYOFWEEK(),DAYOFMONTH()——这天在年,星期,月份里的序数:

select year(20030415012345),year(2009-05-18);
/*
+----------------------+------------------+
| year(20030415012345) | year(2009-05-18) |
+----------------------+------------------+
|                 2003 |             NULL |
+----------------------+------------------+
1 row in set, 1 warning (0.02 sec)
*/

select year(20030415012345),year('2009-05-18');
/*
+----------------------+--------------------+
| year(20030415012345) | year('2009-05-18') |
+----------------------+--------------------+
|                 2003 |               2009 |
+----------------------+--------------------+
1 row in set (0.02 sec)
*/

看到没?如果我不把带有格式的日期放入引号内,返回来的可是NULL哦。

另外,如果year()不带参数的话,是会出错的。嗯。刚才有试验过了。

select month(20030414012345),month('2009-05-18'),month(2009-05-18),month('2009-13-18');
/*
+-----------------------+---------------------+-------------------+---------------------+
| month(20030414012345) | month('2009-05-18') | month(2009-05-18) | month('2009-13-18') |
+-----------------------+---------------------+-------------------+---------------------+
|                     4 |                   5 |              NULL |                NULL |
+-----------------------+---------------------+-------------------+---------------------+
1 row in set, 2 warnings (0.09 sec)
*/

看到没?同样,如果月份不合法的话也会返回NULL的哈,并且带有格式的参数一定要放入引号内。

select monthname('20090518'),monthname('2009-05-18'),monthname(2009-05-18),monthname('2009-13-18');
/*
+-----------------------+-------------------------+-----------------------+-------------------------+
| monthname('20090518') | monthname('2009-05-18') | monthname(2009-05-18) | monthname('2009-13-18') |
+-----------------------+-------------------------+-----------------------+-------------------------+
| May                   | May                     | NULL                  | NULL                    |
+-----------------------+-------------------------+-----------------------+-------------------------+
1 row in set, 2 warnings (0.02 sec)
*/

这个我个人感觉与MONTH()相同哈。只是返回结果是月份的名字,所以当然是英文的啦。 :idea:

select dayofyear(20090518) as day1,dayofyear('20090518') as day2,dayofyear('2009-05-18') as day3,dayofyear(20090518203000) as day4,dayofyear(20091318) as day5;
/*
+------+------+------+------+------+
| day1 | day2 | day3 | day4 | day5 |
+------+------+------+------+------+
|  138 |  138 |  138 |  138 | NULL |
+------+------+------+------+------+
1 row in set, 1 warning (0.02 sec)
*/

呃,DAYOFMONTH()与DAYOFWEEK()同此一样,就不再多举例子了。嗯。

同时,与MONTHNAME()一样,也有DAYNAME()获得该日期所代表的星期名(即星期几)。。

WEEK()函数返回指定日期是一年的第几个星期,YEERWEEK()函数返回指定的日期是哪一年的哪个星期:

select week(20090301) as week1,week(2009-03-01) as week2,week('2009-03-01') as week3,yearweek(20090518) as week4,yearweek(2009-05-18) as week5,yearweek('2009-05-18') as week6;
/*
+-------+-------+-------+--------+-------+--------+
| week1 | week2 | week3 | week4  | week5 | week6  |
+-------+-------+-------+--------+-------+--------+
|     9 |  NULL |     9 | 200920 |  NULL | 200920 |
+-------+-------+-------+--------+-------+--------+
1 row in set, 2 warnings (0.02 sec)
*/

HOUR(),MINUTE()和SECOND()函数分析时间值,并且分别返回小时、分钟和秒的部分:

select hour(182300),second(123400),minute('20:56');
/*
+--------------+----------------+-----------------+
| hour(182300) | second(123400) | minute('20:56') |
+--------------+----------------+-----------------+
|           18 |              0 |              56 |
+--------------+----------------+-----------------+
1 row in set (0.00 sec)
*/

由WEEK()和YEARWEEK()返回的值通常都是在0到53之间(不明白的算一下一年有多少个星期),但是,

我们可以把它修改到1到54之间,而且还可以通过选择函数的第二个参数来决定一个星期是从周日开始还是周一开始

TIME_TO_SEC()——把时间转为秒,SEC_TO_TIME()——把秒数转为一个易读的时间:

select sec_to_time(80),sec_to_time(3720),time_to_sec('24:01:10');
/*
+-----------------+-------------------+-------------------------+
| sec_to_time(80) | sec_to_time(3720) | time_to_sec('24:01:10') |
+-----------------+-------------------+-------------------------+
| 00:01:20        | 01:02:00          |                   86470 |
+-----------------+-------------------+-------------------------+
1 row in set (0.00 sec)
*/

日期相加减也是我们常要用到的,那么MySQL给了我们哪些现成的方法呢?让我来告诉你。
DATE_ADD(),DATE_SUB()——日期相加减:

select date_add('2009-05-18 00:00:00',INTERVAL 6 MONTH);
/*
+--------------------------------------------------+
| date_add('2009-05-18 00:00:00',INTERVAL 6 MONTH) |
+--------------------------------------------------+
| 2009-11-18 00:00:00                              |
+--------------------------------------------------+
1 row in set (0.04 sec)
*/


select date_add('2009-05-18 00:00:00', interval '12 03:45' day_minute);
/*
+-----------------------------------------------------------------+
| date_add('2009-05-18 00:00:00', interval '12 03:45' day_minute) |
+-----------------------------------------------------------------+
| 2009-05-30 03:45:00                                             |
+-----------------------------------------------------------------+
1 row in set (0.02 sec)
*/


select date_sub('2009-05-18 00:00:00',interval 6 hour);
/*
+-------------------------------------------------+
| date_sub('2009-05-18 00:00:00',interval 6 hour) |
+-------------------------------------------------+
| 2009-05-17 18:00:00                             |
+-------------------------------------------------+
1 row in set (0.00 sec)
*/


select date_sub('2009-05-18 00:00:00', interval '13-4' year_month);
/*
+-------------------------------------------------------------+
| date_sub('2009-05-18 00:00:00', interval '13-4' year_month) |
+-------------------------------------------------------------+
| 1996-01-18 00:00:00                                         |
+-------------------------------------------------------------+
1 row in set (0.02 sec)
*/

呵呵,好了。就写这么多吧。这么多方法,如果不经常敲,肯定是会忘的。嗯。

所以记住,勤劳很重要,我很懒。呵呵。

再把可以和DATE_ADD()和DATE_SUB()一起使用的关键字和格式整理一下吧,嗯。。

关键字                                          间隔值的格式

DAY                                                日期

DAY_HOUR                                 日期:小时

DAY_MINUTE                            日期:小时:分钟

DAY_SECOND                             日期:小时:分钟:秒

HOUR                                             小时

HOUR_MINUTE                         小时:分钟

HOUR_SECOND                          小时:分钟:秒

MINUTE                                        分钟

MINUTE_SECOND                     分钟:秒

MONTH                                         月

SECOND                                        秒

YEAR                                              年

YEAR_MONTH                               年-月

文章作者:simaopig
本文地址:http://www.xiaoxiaozi.com/2009/05/18/532/
版权所有 © 转载时必须以链接形式注明作者和原始出处!

14 Responses to “MySQL 那些你不知道的 时间和日期函数”

  1. #1 张岩 回复 | 引用 Post:2009-05-19 12:35

    感兴趣是真的,没基础是真的,看不懂也是真的。。。。 :mad:

    [回复]

  2. #2 simaopig 回复 | 引用 Post:2009-05-19 12:38

    @张岩
    呵呵,感兴趣就好。呵呵。

    我不也是因为不会才学的嘛。唉。其实这个东西真的很枯燥。 :cry:

    [回复]

  3. #3 bolo 回复 | 引用 Post:2009-05-19 12:40

    说一下用php如何写入和读取mysql吧,这篇文章貌似是在服务器上用的,不是人人都懂

    [回复]

  4. #4 simaopig 回复 | 引用 Post:2009-05-19 12:45

    @bolo
    保留意见,因为真正需要知道PHP如果读写数据库的人,感觉不多。。

    而且这是我的笔记,感觉写那个有些不搭边。呵。

    [回复]

  5. #5 Claymore 回复 | 引用 Post:2009-05-19 14:40

    呵呵,UNIX_TIMESTAMP我用得较多,其他函数压根没用过,一般都是用PHP来处理时间…

    [回复]

  6. #6 小小子 回复 | 引用 Post:2009-05-19 14:46

    @Claymore
    是啊,只是看书看到这了,觉得有必要记一下就写下来了。呵。

    万一哪天见到不至于抓瞎。呵。

    还有,我用的最多的还是NOW(),和表结构有关。呵。

    [回复]

  7. #7 LAONB 回复 | 引用 Post:2009-05-19 16:13

    很不错的东西,你这技术类的知识挺丰富。
    昨天晚上因为两个JS冲突玩到了4点还是没搞定 :!:

    [回复]

  8. #8 simaopig 回复 | 引用 Post:2009-05-19 16:15

    @LAONB
    呃,凌晨吗?你太有才了。。。

    [回复]

  9. #9 粥小卜 回复 | 引用 Post:2009-05-19 19:37

    数据库白痴飘过

    [回复]

  10. #10 simaopig 回复 | 引用 Post:2009-05-19 21:44

    @粥小卜
    呃,,设计高手,飘就飘吧。呵。

    [回复]

  11. #11 JetKing 回复 | 引用 Post:2009-05-20 13:15

    说实话,很多函数我都是用的时候再GOOGLE,那么多函数哪记得完呐。。

    [回复]

  12. #12 JetKing 回复 | 引用 Post:2009-05-20 13:17

    对了,你WP用的显示代码的插件叫什么名字啊?
    代码中语法关键字链接到帮助手册页面这功能蛮帅的(要是改成新窗口打开就更好了~)

    [回复]

  13. #13 simaopig 回复 | 引用 Post:2009-05-20 16:01

    @JetKing
    是啊,我也记不完,所以就写一下,方便你们搜索啊,呵呵 -_-!!!

    这个插件名字叫”codecolorer” 我稍候看看改一下。呵。谢谢提醒。

    [回复]

  14. #14 TaoGOGO 回复 | 引用 Post:2010-10-15 18:16

    真厉害,我一个也没有用到,请问from_unixtime和strtotime那个速度更快一些?

    [回复]

发表评论

:wink: :twisted: :roll: :oops: :mrgreen: :lol: :idea: :evil: :cry: :arrow: :?: :-| :-x :-o :-P :-D :-? :) :( :!: 8-O 8)