我有这张桌子。该表有一堆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。
答案 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')
。
感谢大家的建议。