这几天写代码;反复用到将日期时间字段转化成数字串和日期格式字符串的情况;感觉自己还处于壹知半解之中;索性花点时间查下相关资料;基本弄明白了 mysql 中两个常用的日期函数的用法;记录于此;作为笔记供参考。
1、FROM_UNIXTIME( unix_timestamp )
参数;通常是壹个十位的数字;如;1344887103
返回值;有两种;可能是类似 ;YYYY-MM-DD HH:MM:SS; 这样的字符串;也有可能是类似于 YYYYMMDDHHMMSS.uuuuuu 这样的数字;具体返回什么取决于该函数被调用的形式。
mysql> select FROM_UNIXTIME(1344887103); ;---------------------------; | FROM_UNIXTIME(1344887103) | ;---------------------------; | 2012-08-14 03:45:03 | ;---------------------------; 1 row in set (0.00 sec)
2、FROM_UNIXTIME( unix_timestamp ;format )
参数 unix_timestamp ;与方法 FROM_UNIXTIME( unix_timestamp ) 中的参数含义一样;
参数 format : 转换之后的时间字符串显示的格式;
返回值;按照指定的时间格式显示的字符串;
mysql> select FROM_UNIXTIME(1344887103,%Y-%M-%D %h:%i:%s;); ;-----------------------------------------------; | FROM_UNIXTIME(1344887103,%Y-%M-%D %h:%i:%s;) | ;-----------------------------------------------; | 2012-August-14th 03:45:03 | ;-----------------------------------------------; 1 row in set (0.00 sec) mysql> select FROM_UNIXTIME(1344887103,%Y-%m-%D %h:%i:%s;); ;-----------------------------------------------; | FROM_UNIXTIME(1344887103,%Y-%m-%D %h:%i:%s;) | ;-----------------------------------------------; | 2012-08-14th 03:45:03 | ;-----------------------------------------------; 1 row in set (0.00 sec)
参考链接;https://dev.mysql.com/doc/refman/5.0/en/date-and-time-functions.html#function_from-unixtime
1、UNIX_TIMESTAMP()
返回值;当前时间的UNIX格式数字串;或者说是 UNIX 时间戳;从 UTC 时间;1970-01-01 00:00:00;开始的秒数;;通常为十位;如 1344887103。
mysql> select unix_timestamp(); ;------------------; | unix_timestamp() | ;------------------; | 1344887103 | ;------------------; 1 row in set (0.00 sec)
2、UNIX_TIMESTAMP( date )
参数;date 可能是个 DATE 字符串;DATETIME 字符串;TIMESTAPE 字符串;或者是一个类似于 YYMMDD 或者 YYYYMMDD 的数字串。
返回;从 UTC 时间;1970-01-01 00:00:00;开始到该参数之间的秒数。服务器将参数 date 解释成当前时区的壹个值并且将其转化成 UTC 格式的内部时间。客户端则可以自行设置当前时区。当 UNIX_TIMESTAMP() 用于壹个 TIMESTAMP 列时;函数直接返回内部时间戳的值;如果你传递壹个超出范围的时间到 UNIX_TIMESTAMP();它的返回值是零。
mysql> SELECT UNIX_TIMESTAMP(); ;------------------; | UNIX_TIMESTAMP() | ;------------------; | 1344888895 | ;------------------; 1 row in set (0.00 sec) mysql> SELECT UNIX_TIMESTAMP(;2012-08-14 16:19:23;); ;---------------------------------------; | UNIX_TIMESTAMP(;2012-08-14 16:19:23;) | ;---------------------------------------; | 1344932363 | ;---------------------------------------; 1 row in set (0.00 sec)
注意;如果你使用 UNIX_TIMESTAMP() 和 FROM_UNIXTIME() 来转换 TIMESTAMP 值与 Unix 时间戳的值;精度会丢失;因为这个映射在两个方向上不是一一对应的。比如说;由于本地时区的更改;有可能两个 UNIX_TIMESTAMP() 会映射到同壹个 Unix 时间戳的值。 FROM_UNIXTIME() 只会映射到原来的那个时间戳的值上。这里有个例子;在 CET 时区使用 TIMESTAMP;
mysql> SELECT UNIX_TIMESTAMP(;2005-03-27 03:00:00;); ;---------------------------------------; | UNIX_TIMESTAMP(;2005-03-27 03:00:00;) | ;---------------------------------------; | 1111885200 | ;---------------------------------------; mysql> SELECT UNIX_TIMESTAMP(;2005-03-27 02:00:00;); ;---------------------------------------; | UNIX_TIMESTAMP(;2005-03-27 02:00:00;) | ;---------------------------------------; | 1111885200 | ;---------------------------------------; mysql> SELECT FROM_UNIXTIME(1111885200); ;---------------------------; | FROM_UNIXTIME(1111885200) | ;---------------------------; | 2005-03-27 03:00:00 | ;---------------------------;
参考链接; https://dev.mysql.com/doc/refman/5.0/en/date-and-time-functions.html#function_unix-timestamp
参数format可以有的形式;
%M 月名字(January;December) %W 星期名字(Sunday;Saturday) %D 有英语前缀的月份的日期(1st, 2nd, 3rd, 等等。; %Y 年, 数字, 4 位 %y 年, 数字, 2 位 %a 缩写的星期名字(Sun;Sat) %d 月份中的天数, 数字(00;31) %e 月份中的天数, 数字(0;31) %m 月, 数字(01;12) %c 月, 数字(1;12) %b 缩写的月份名字(Jan;Dec) %j 一年中的天数(001;366) %H 小时(00;23) %k 小时(0;23) %h 小时(01;12) %I 小时(01;12) %l 小时(1;12) %i 分钟, 数字(00;59) %r 时间,12 小时(hh:mm:ss [AP]M) %T 时间,24 小时(hh:mm:ss) %S 秒(00;59) %s 秒(00;59) %p AM或PM %w 一个星期中的天数(0=Sunday ;6=Saturday ; %U 星期(0;52), 这里星期天是星期的第一天 %u 星期(0;52), 这里星期一是星期的第一天 %% 一个文字%
Linux时区和时间都正确,crontab执行时间与系统时间不同步