微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

mysql – 不正确的DateTime值’0000-00-00 00:00:00′ – Date_Sub()in Having

所以我有一个看起来像这样的插入:

  INSERT INTO TempDupeData (Sys_InvoiceID, DupeSetID, Netted, InvoiceNo, InvoiceDate, Sys_supplierID, SuppInvNo, NetAmount, VATAmount, GrossAmount, PayDate, PayRef,PayRefNo, PayType,
    PayAmount, Curr, GBPNetAmount, GBPVATAmount, GBPGrossAmount, NetAmountAbs, GrossAmountAbs, VATAmountAbs, DocType, SuppInvNoNums, VATPerc, VATA, VATB, VATC,
  VATD, VATE, VAtpotentialClaim, Claimstatus, SuppInvNoSubst, SuppInvNoSubstFlag, DupeSubstGross, DupeSubstNet, SuppInvNoCharMap, SuppInvNoCharMapFlag, SeqErrFlag)

    SELECT
      FK_SysInvoiceID,
      CONCAT(CTE.NetAmountAbs, CTE.AccountNumber),
      Netted,
      InvoiceNo,
      InvoiceDate,
      I.FK_supplierID,
      SuppInvNo,
      NetAmount,
      VATAmount,
      GrossAmount,
      PayDate,
      PayRef,
      PayRefNo,
      PayType,
      PayAmount,
      Curr,
      GBPNetAmount,
      GBPVATAmount,
      GBPGrossAmount,
      CTE.NetAmountAbs,
      GrossAmountAbs,
      VATAmountAbs,
      DocType,
      SuppInvNoNums,
      VATPerc,
      VATA,
      VATB,
      VATC,
      VATD,
      VATE,
      VAtpotentialClaim,
      Claimstatus,
      SuppInvNoSubst,
      SuppInvNoSubstFlag,
      DupeSubstGrs,
      DupeSubstNet,
      SuppInvNoCharMap,
      SuppInvNoCharMapFlag,
      SeqErrFlag
    FROM (SELECT
        FK_supplierID,
        AccountNumber,
        NetAmountAbs,
        CASE WHEN MIN(NetAmountAbs) < SUM(NetAmount) THEN 0 ELSE -1 END AS Netted

      FROM invoice
      WHERE NetAmountAbs >= 500 and InvoiceDate IS NOT null
      GROUP BY FK_supplierID,
               NetAmountAbs
      HAVING COUNT(*) > 1
      AND ((SUM(CASE WHEN NetAmount >= 0 THEN 1 ELSE 0 END)) > 1)
      AND (MAX(SuppInvNoNums) != MIN(SuppInvNoNums))
      AND (MIN(InvoiceDate) != MAX(InvoiceDate))
      AND (DATE_SUB(MAX(COALESCE(InvoiceDate, Now())) <= MIN(COALESCE(InvoiceDate, Now())), INTERVAL 30 DAY))
      AND (MAX(GrossAmountAbs) != MIN(GrossAmountAbs))) CTE
      INNER JOIN invoice I
        ON CTE.NetAmountAbs = I.NetAmountAbs
        AND CTE.FK_supplierID = I.FK_supplierID
    ORDER BY CTE.NetAmountAbs DESC, CTE.FK_supplierID;

它从表中执行,执行一些计算,连接自身然后插入.它失败了这条消息:不正确的DateTime值’0000-00-00 00:00:00′.我缩小了它,如果我从having子句中删除这一行(DATE_ADD(MAX(COALESCE(InvoiceDate,Now()))< = MIN(COALESCE(InvoiceDate,Now())),INTERVAL -30 DAY))有用. 事实上,当我奇怪地删除插入时,它可以工作. 选择不会返回任何内容但它仍然失败. 为什么是这样?任何人都可以帮忙找出原因吗?

解决方法:

第一种选择:

此警告可能是由sql_mode引起的.

根据MysqL文档“如果启用了NO_ZERO_DATE或NO_ZERO_IN_DATE sql模式,则不允许零日期或部分日期.”所以这可能是你的INSERT与’0000-00-00 00:00:00’失败的原因.

您可以通过执行以下命令来检查您的sql模式:

SELECT @@sql_mode;

如果设置了NO_ZERO_DATE或NO_ZERO_IN_DATE中的任何一个,那么您可以:

SET sql_mode = '';

第二种选择

一个选择是由于STRICT_TRANS_TABLES模式而失败.
正如MysqL文档所说:

Strict mode affects whether the server permits ‘0000-00-00’ as a valid
date: If strict mode is not enabled, ‘0000-00-00’ is permitted and
inserts produce no warning. If strict mode is enabled, ‘0000-00-00’ is
not permitted and inserts produce an error, unless IGnorE is given as
well. For INSERT IGnorE and UPDATE IGnorE, ‘0000-00-00’ is permitted
and inserts produce a warning

这对于datetime也是有效的.

因此,您必须禁用STRICT MODE或禁用它不是一个选项 – 修改查询,使其不返回无效的日期/日期时间结果

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐