代码之家  ›  专栏  ›  技术社区  ›  John Fiala

为什么此mysql表在datetime字段中生成空值?

  •  0
  • John Fiala  · 技术社区  · 15 年前

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

    在test_tmp表中,字段包含一个月日期对,如“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中都包含空值。

    4 回复  |  直到 15 年前
        1
  •  2
  •   Raffael Luthiger    15 年前

    遗憾的是,我还不能发表评论。所以我必须在这里写。

    在SQL语句的末尾,您有一个')'到很多。在您复制/粘贴此代码时是否有更多的剪切?

        2
  •  1
  •   Raffael Luthiger    15 年前

    你收到错误信息了吗?

    你能把“忽略”放在一边,然后看看你有什么消息吗?

    根据 MySQL website : 如果未指定ignore,将触发错误的数据转换将中止语句。使用ignore时,将无效值调整为最接近的值并插入;将生成警告,但语句不会中止。

    这种调整在你的情况下可能发生。这到底是什么样的场地?

        3
  •  0
  •   DreadPirateShawn    15 年前

    为了测试您的查询,我运行了以下命令:

    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”等,否则,str_to_date失败将导致空值。

        4
  •  0
  •   John Fiala    15 年前

    我终于找到了自己问题的答案。

    注意到我是怎么把“drupal”标签贴在这个问题上的吗?查询正在通过Drupal…如果您不希望使用%字符替换数据,则需要对其进行转义。所以, str_to_date(concat(expiredate, ' ', year(now())), '%b %d %Y') 实际上需要 str_to_date(concat(expiredate, ' ', year(now())), '%%b %%d %%Y') .

    谢谢你们的建议,伙计们。