我有一个viewedAt
列DATETIME
并接受NULL
值。将每个新记录上的列设置为0000-00-00 00:00:00
是一个软件限制,因此我使用Symfony和Doctrine进行简单的操作,如下所示:
$entEmail = new Email();
$entEmail->setViewedAt(new \DateTime('0000-00-00 00:00:00'));
但令人惊讶的是PHP将该日期更改为此-0001-11-30 00:00:00
并且MySQL服务器中的SQL模式设置为STRICT,因此查询失败。我在这里阅读了一些主题this,this以及其他一些主题,但根本没有回答我的疑问。我仅用PHP进行了一些测试,结果几乎相同:
$date = new DateTime("0000-00-00 00:00:00", new DateTimeZone('America/New_York'));
echo $date->format('Y-m-d h:i:s');
// outputs
// -0001-11-30 12:00:00
即使MySQL模式设置为STRICT
,我也测试了以下查询,它的工作方式如下图所示:
INSERT INTO emails(`emails_category`, `deliveredAt`, `viewedAt`, `data`, `createdAt`, `updatedAt`, `reps_id`, `targets_id`) VALUES ("sent","2015-10-29 06:08:25","0000-00-00 00:00:00",null,"2015-10-29 06:08:25","2015-10-29 06:08:25","005800000058eYcAAI","0018000001GO8omAAD")
所以viewedAt
即使无效也接受0000-00-00 00:00:00
该值(我认为它的类型为NULL左右)
我如何解决这个问题?有什么工作吗?在这个特定情况下,您对我的建议是什么?这是一个软件要求而且无法更改?
我使用的是Symfony 2.7.6,Doctrine 2.5.2和PHP 5.5.30
答案 0 :(得分:7)
您的架构开始时是错误的。问题不在于设置日期本身,这显然是无效的,MySQL和PHP都拒绝它,因为没有0年和0月没有0,你看到的输出只是对一种有效的日期(它是1年1月1日和1月1日之前的1天)。但是如果你做得对的话,你也只是错过了Doctrine摘录它的观点:
$entEmail = new Email();
$entEmail->setViewedAt(null);
Doctrine现在很乐意将NULL
放在数据库列中。
答案 1 :(得分:0)
$Date = date('Y-m-d H:i:s');
有时候使用老式的方式更容易吗?
答案 2 :(得分:0)
这取决于您的数据库字段。在MySQL中,TIMESTAMP
字段是1970年后的。
如果要使其可为空,则应使字段允许为null。即使您使用DATE
字段,也应该发布1000AD。
如果您打算使用实时时间戳,可以使用以下内容:
date_default_timezone_set('America/New_York');
$date = date('Y-m-d H:i:s');
$entEmail = new Email();
$entEmail->setViewedAt( $date );
或(如果你想要更简洁)
date_default_timezone_set('America/New_York');
$entEmail = new Email();
$entEmail->setViewedAt( date('Y-m-d H:i:s') );