MySQL的日期时间类型和函数

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');


 

 timestamp默认值的使用和自动更新当前时间

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可以表示。


使用timestamp时要注意时区问题:


详见博客:MySQL的timestamp与时区问题http://blog.csdn.net/longyulu/article/details/8996122


 

你可能感兴趣的:(mysql,Date)