为什么这个mysql表在datetime字段中产生NULL?

时间:2009-06-26 22:01:51

标签: sql mysql drupal null

我有这张桌子。该表有一堆char字段,但有问题的字段(expiredate)在test_tmp表中包含一个char,在test表上包含一个datetime。 (表名已更改以保护客户端。)

在test_tmp表中,该字段包含Month-Date对,如'Aug 10'或'Feb 20'。我用来插入数据的代码是:

INSERT IGNORE INTO test (RECNUM, ORDERNUM, CREATEDATE, EXPIREDATE, FNAME, LNAME)
  SELECT RECNUM, ORDERNUM, CREATEDATE,
    CAST(CASE WHEN str_to_date(concat(expiredate, ' ', year(now())), '%b %d %Y') <= CURDATE()
    THEN str_to_date(concat(expiredate, ' ', 1+year(now())), '%b %d %Y')
    ELSE str_to_date(concat(expiredate, ' ', year(now())), '%b %d %Y') END AS DATETIME) AS EXPIREDATE, FNAME, LNAME FROM test_tmp

真正令人困惑的是,如果我运行查询的“SELECT”部分,一切看起来都很好。但是如果我运行整个事情(首先截断测试表),则每行在expiredate中包含NULL。

4 个答案:

答案 0 :(得分:2)

可悲的是我还没有发表评论。这就是我必须在这里写的原因。

在SQL语句结束时,你有一个')'。复制/粘贴此代码时是否还有更多剪切?

答案 1 :(得分:1)

您收到任何错误消息吗?

你可以离开IGNORE,看看你有没有留言?

根据MySQL website: 如果未指定IGNORE,则会触发错误的数据转换会中止语句。使用IGNORE,将无效值调整为最接近的值并插入;产生了警告,但声明没有中止。

这种调整可能发生在你的情况下。这到底是什么类型的领域?

答案 2 :(得分:0)

为了测试您的查询,我运行了以下内容:

SELECT CAST(CASE WHEN str_to_date(concat('Jan 5', ' ', year(now())), '%b %d %Y') <= CURDATE()
    THEN str_to_date(concat('Jan 5', ' ', 1+year(now())), '%b %d %Y')
    ELSE str_to_date(concat('Jan 5', ' ', year(now())), '%b %d %Y') END AS DATETIME) AS EXPIREDATE;

这很好用。为了确保,EXPIREDATE应该采用“Jan 5”等形式,否则NULL会导致str_to_date失败。

答案 3 :(得分:0)

好吧,我最后找到了自己问题的答案。

请注意我如何在问题上加上“drupal”标签?该查询正在通过Drupal ...如果您不希望它用于替换数据,则需要您转义%字符。因此,str_to_date(concat(expiredate, ' ', year(now())), '%b %d %Y')实际上需要str_to_date(concat(expiredate, ' ', year(now())), '%%b %%d %%Y')

感谢大家的建议。