将DATE类型列的默认值设置为当前日期而不包含时间部分?

25 浏览
0 Comments

将DATE类型列的默认值设置为当前日期而不包含时间部分?

注意:问题是关于DATE类型,而不是Datetime或Timestamp类型。

如何将日期数据类型的列改为默认使用当前日期?

我看到了很多关于datetime(带有时间部分)的示例,但没有关于date的。我尝试过:

ALTER TABLE `accounting` ALTER `accounting_date`

SET DEFAULT CURRENT_DATE;

ALTER TABLE `accounting` CHANGE `accounting_date`

`accounting_date` DATE NOT NULL DEFAULT CURRENT_DATE;

我还尝试过使用CURDATE()、NOW()、CURRENT_DATE()...

0
0 Comments

在MySQL中,可能无法为'date'数据类型设置默认值。您需要将类型更改为timestamp或datetime。

您可以看一下这个类似的问题。

Invalid default value for 'Date'

编辑:

在5.6.5版本中,可以在datetime列上设置默认值,甚至可以创建一个在更新行时更新的列。类型定义:

CREATE TABLE foo (
    `creation_time`     DATETIME DEFAULT CURRENT_TIMESTAMP,
    `modification_time` DATETIME ON UPDATE CURRENT_TIMESTAMP
)

参考:http://optimize-this.blogspot.com/2012/04/datetime-default-now-finally-available.html

他明确说了Date,而不是Datetime。

0
0 Comments

问题的原因是在MySQL 8.0+版本中,想要将DATE类型列的默认值设置为当前日期,但是不包含时间部分。解决方法是使用DATE_FORMAT函数对NOW()函数的输出进行格式化,以去除时间部分。

具体的解决方法如下所示:

CREATE TABLE foo (
    `creation_time`     DATE DEFAULT (DATE_FORMAT(NOW(), '%Y-%m-%d'))
)

某些情况下为什么在保存时要使用格式化。实际上,格式化通常是在输出值时使用的,而不是在保存时。然而,NOW()函数也会输出一个值。在这个意义上,DATE_FORMAT()和NOW()以及其他输出值的函数并没有太大的区别。DATE类型接受格式为Y-m-d的字符串或DATE对象;而NOW()输出的是DATETIME对象,其字符串表示包含时间部分。虽然有很多其他方法可以实现这个目的,但在这种情况下,我们的做法是将创建时间的默认值设置为此刻的日期部分。基本上,我们去掉NOW()输出的时间部分,创建一个Y-m-d格式的字符串,并将其设置为creation_time的值。

某些情况下在你的例子中使用DATE_FORMAT函数是多余的,甚至还会影响性能。你可以只使用NOW()而不进行格式化,它会以相同的输出工作。

某些情况下NOW()对我来说一直在出错,也许我还犯了其他我不知道的错误...已经过了一段时间,我不记得当时具体出了什么问题。然而,由于那次的经历,我当时使用了上述语句作为一个解决方法。尽管如此,你对性能的担忧是正确的,特别是对于高INSERT负载,DATE_FORMAT()是多余的。另外,是的,我刚刚尝试过,只使用NOW()也可以正常工作。

0
0 Comments

问题的原因是在设置日期类型的列的默认值时,如果没有使用括号将CURDATE()函数包裹起来,就会导致默认值无效。

解决方法是在设置默认值时,使用括号将CURDATE()函数包裹起来。

示例代码如下:

datecolumn date DEFAULT (CURDATE())

这样就可以正确地设置日期类型列的默认值为当前日期而不包含时间部分了。

0