mysql常用的日期时间函数
timestamp占4字节(1970-2037)
datetime占8字节(1000-9999)
timestamp和 unix timestamp同样表示1970-01-01 00:00:00 GMT到现在的毫秒数。但前者是以时间格式显示,后者以数字显示。
当前时间日期
select CURRENT_DATE() select CURRENT_TIME() select CURRENT_TIME() select CURRENT_TIMESTAMP()增加减少多少天月的日期
TIMESTAMPADD(unit,interval,datetime_expr) select TIMESTAMPADD(day,10, CURRENT_TIMESTAMP()) DATE_ADD(date,INTERVAL expr unit) select DATE_SUB(CURRENT_TIMESTAMP(),INTERVAL 1 MONTH)日期的差
TIMESTAMPDIFF(unit,datetime_expr1,datetime_expr2) select TIMESTAMPDIFF(DAY,'2011-10-30', '2012-02-22') SELECT TIMESTAMPDIFF(MONTH,'2011-11-11','2009-09-09');
1,TIMESTAMP not null DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP 在创建新记录和修改现有记录的时候都对这个数据列刷新 2,TIMESTAMP not null DEFAULT CURRENT_TIMESTAMP 在创建新记录的时候把这个字段设置为当前时间,但以后修改时,不再刷新它 3,TIMESTAMP not null ON UPDATE CURRENT_TIMESTAMP 在创建新记录的时候把这个字段设置为0,以后修改时刷新它 确认是0?---这种说明是错误的。 创建时候不给值则是'0000-00-00 00:00:00',给null值则是自动生成当前时间。 4,TIMESTAMP not null DEFAULT ‘yyyy-mm-dd hh:mm:ss’ ON UPDATE CURRENT_TIMESTAMP 在创建新记录的时候把这个字段设置为给定值,以后修改时刷新它,比如可以是 '0000-00-00 00:00:00'
补充:
但是同一张表中不能同时设置两个列默认CURRENT_TIMESTAMP
Incorrect table definition; there can be only one TIMESTAMP column with CURRENT_TIMESTAMP in DEFAULT or ON UPDATE clause
但是可以有如下情况
CREATE TABLE tb ( `a` char(1) DEFAULT NULL, `b` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, `c` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
insert的时候 c列也会默认更新为当前时间的,真奇特,哈哈。update的话C列就没反应了。
找到问题了
如果是不允许为空NOT NULL DEFAULT '0000-00-00 00:00:00' ,那么insert的时候如果插入null,会自动更新为当前时间;如果不给当前字段insert值,那么将会更新为'0000-00-00 00:00:00;
如果允许为空NULL DEFAULT '0000-00-00 00:00:00' ,那么insert的时候如果插入null,会更新为null;如果不给当前字段insert值,那么将会更新为'0000-00-00 00:00:00;
也就是说插入值是如果给null值,如果允许空,那么插入空,如果不允许为空,那么插入当前时间。
插入值时如果不给该字段赋值(当然也不是赋空值),那么有默认值的自动插入默认值,没有默认值的插入'0000-00-00 00:00:00'。
1.MySQL默认表的第一个timestamp字段为NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP属性,必须显式定义改变这种行为。
2.MySQL只允许一个timestamp字段拥有[DEFAULT CURRENT_TIMESTAMP |ON UPDATE CURRENT_TIMESTAMP]属性。
3.如果不想更新会自动更新为当前时间的列,那么我们可以设置 update tbname set colname='sss', coltime=coltime where col1=123;
4. select UNIX_TIMESTAMP(),unix_timestamp('2038-01-01 11:11:11'); 毫秒数为2145928271,21亿,无符号的int可以表示。
详见博客:MySQL的timestamp与时区问题http://blog.csdn.net/longyulu/article/details/8996122