mysql对datetime数据类型操作_关于mysql:将NOW()设置为datetime数据类型的默认值?...

我在表用户中有两列,即registerDate and lastVisitDate,它由datetime数据类型组成。我想做以下的事情。

将registerdate默认值设置为mysql now()。

将LastVisitDate默认值设置为0000-00-00 00:00:00,而不是默认使用的空值。

因为该表已经存在并且有现有记录,所以我想使用修改表。我试过使用下面的两段代码,但都不起作用。

它给了我一个错误:ERROR 1067 (42000): Invalid default value for 'registerDate'。

我可以在MySQL中将默认的日期时间值设置为now()吗?

ALTER TABLE users MODIFY dateTime timestamp default CURRENT_TIMESTAMP。在你的两项努力中,你都没有定义领域的data type。

因为mysql 5.6 DATE应该使用默认值NOW()来工作。

根据这个mysql 5.6文档:dev.mysql.com/doc/refman/5.6/en/data-type-defaults.html,您可以使用当前的时间戳()作为默认值。

我如何实现当前的时间戳+1天

从MySQL5.6.5开始,可以使用带有动态默认值的DATETIME类型:

或者甚至结合这两个规则:

参考文献:http://dev.mysql.com/doc/refman/5.7/en/timestamp-initialization.htmlhttp://optimize-this.blogspot.com/2012/04/datetime-default-now-finally-available.html

在5.6.5之前,您需要使用TIMESTAMP数据类型,该类型在修改记录时自动更新。然而,不幸的是,每个表只能存在一个自动更新的TIMESTAMP字段。

请参阅:http://dev.mysql.com/doc/refman/5.1/en/create-table.html

如果要防止mysql更新UPDATE上的时间戳值(这样它只在INSERT上触发),可以将定义更改为:

我真的不想使用时间戳。

@易卜拉欣,为什么不呢?,您将ALTER TABLE users MODIFY registerDate datetime DEFAULT CURRENT_TIMESTAMP;声明为问题中的一个明确示例。

@易卜拉欣:时间戳是你唯一的机会。如果使用日期时间字段,则每次都必须使用now()插入记录。

Manual说得很清楚:"例如,这意味着您不能将日期列的默认值设置为函数的值,如now()或当前的日期"。

@Johan DATETIME通常更倾向于选择它所能保持的范围:"1000-01-01 00:00:00"到"9999-12-31 23:59:59",而TIMESTAMPS的"1970-01-01 00:00:00:01"到"2038-01-19 03:14:07"的UTC。用于存储出生日期,或未来30年以上的时间。

也叫ALTER TABLE users MODIFY registerDate TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP;。

更好地链接到手册:dev.mysql.com/doc/refman/5.1/en/timestamp initialization.htm‌&8203;l,其中明确指出,上面的空timestamp列获取"默认当前时间戳"和"更新当前时间戳"行为。

只能有一个时间戳列具有默认的当前时间戳。因此,如果您希望使用两列,例如"创建日期"、"上次编辑",则此解决方案不起作用。

@nickrulez从mysql 5.6开始,这种行为不再局限于timestamp。

插件上的modification_time是什么?会是NULL吗?

我使用触发器作为解决方法,将新插入的日期时间字段设置为now():

CREATE TRIGGER `triggername` BEFORE INSERT ON  `tablename`

FOR EACH ROW

SET NEW.datetimefield = NOW()

它也应该适用于更新

Johan&Leonardo的答案涉及到转换到时间戳字段。尽管这对于问题中的用例(存储registerdate和lastvisitdate)可能是可以的,但它不是一个通用的解决方案。请参见日期时间与时间戳问题。

这应该是可接受的答案,但具体来说,您应该对其进行编辑,以使其明显地适用于日期时间字段。最初的海报想知道如何为datetime字段解决它,如果您真正了解这两种数据类型之间的区别,那么use a timestamp是一种愚蠢的解决方法。

我的解决方案

这个def可以工作,我建议每个人都使用sqlyog或类似的工具,它可以让你在一个简单的界面上完成这些工作。

这仍然是timestamp列的解决方案。没有人要埃多克斯一〔4〕…

是的,这不是问题的答案。时间戳是与日期时间不同的字段类型。

@莱昂纳多我怎么能只显示日期

尤里卡!!!!

对于那些在MySQL中试图设置默认日期时间值而失去信心的人来说,我完全知道你的感受。这里是:

`ALTER TABLE  `table_name` CHANGE `column_name` DATETIME NOT NULL DEFAULT 0

仔细观察,我没有在0附近添加单引号/双引号。

重要更新:

这个答案很早就贴出来了。当时,它在我(可能是最新的)MySQL安装中起作用,我想分享它。在决定现在使用此解决方案之前,请阅读下面的注释。

对我很有帮助……)

很高兴我能帮忙!D

这取决于期望…-由于提供了默认值,此解决方案允许您将字段设置为非空。-此解决方案不会将字段设置为now()。

这并不能回答最初的问题;答案应该清楚地说明这一点。

请注意,传统的SQL模式不包括"零日期",因此在这种情况下,上述模式将不起作用。

根据提供的答案,听起来如果不牺牲日期时间作为时间戳,那么必须使用触发器。

这个答案是不对的。"单引号中的0000-00-00 00 00:00:00是非空日期时间字段的"零"等效值,如果可能,应避免使用,原因有很多。如果确实不想使用时间戳,请使用触发器将日期时间自动更新为now()。

这个解决方案将有一些API疯狂的"OMG它的零日期!真是异端!我们无法将"this"转换为java.lang.date/system.datetime!天啊!-崩溃-"。

就像@codereaper说的,这取决于你想做什么。我想把它设置为"0000-00-00 00:00:00",所以这对我来说非常有效,我正在投票。

零日期不是当前时间!P

如果我没记错,这就回答了第二个子问题。

MySQL5.6文档说当前的时间戳可以作为时间戳和日期时间数据类型的默认值:

http://dev.mysql.com/doc/refman/5.6/en/timestamp-initialization.html

正好从5.6.5开始,因为我有5.6.22,如果是5.6,它就不起作用了。太糟糕了。

在MySQL5.6.5及更高版本上,您可以使用精确的日期时间并设置默认值。不过,还有一点很微妙,那就是将精度值传递给datetime和now()函数调用。

此示例有效:

此示例不起作用:

最好的方法是使用"默认0"。其他方式:

/************ ROLE ************/

drop table if exists `role`;

create table `role` (

`id_role` bigint(20) unsigned not null auto_increment,

`date_created` datetime,

`date_deleted` datetime,

`name` varchar(35) not null,

`description` text,

primary key (`id_role`)

) comment='';

drop trigger if exists `role_date_created`;

create trigger `role_date_created` before insert

on `role`

for each row

set new.`date_created` = now();

`ALTER TABLE  `table_name` CHANGE `column_name`

timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP

ON UPDATE CURRENT_TIMESTAMP

可用于在更新时更新时间戳。

最后,这对我有用!

这对我很有用,使用mysql:

这对我很有效-刚将insert更改为update for my table。

INSERT INTO Yourtable (Field1, YourDateField) VALUES('val1', (select now()))

不确定这是否仍然是活动的,但这里是。

关于将默认值设置为now(),我认为对于datetime数据类型来说,这是不可能的。如果要使用该数据类型,请按如下方式设置执行插入操作的日期:

INSERT INTO Yourtable (Field1, YourDateField) VALUES('val1', (select now()))

我的MySQL版本是5.5

可以简化为:INSERT INTO Yourtable (Field1, YourDateField) VALUES('val1', NOW())。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值