不正确的DateTime值'0000-00-00 00:00:00'-Date_Sub()在

安德鲁·基尔本

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

  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;

它从表中获取数据,执行一些计算,对其自身进行联接,然后进行插入。失败,并显示以下消息:Incorrect DateTime Value '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_DATENO_ZERO_IN_DATE,则您可以:

SET sql_mode = '';

第二选择

另一个选择是由于STRICT_TRANS_TABLES模式而失败如mysql文档所说:

严格模式影响服务器是否允许将“ 0000-00-00”作为有效日期:如果未启用严格模式,则允许“ 0000-00-00”,并且插入不会产生警告。如果启用了严格模式,则除非也给出IGNORE,否则不允许使用“ 0000-00-00”,并且插入会产生错误。对于INSERT IGNORE和UPDATE IGNORE,允许使用“ 0000-00-00”,并且插入会产生警告

日期时间也一样。

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

MySQL不正确的日期时间值:“ 0000-00-00 00:00:00”

日期时间值不正确:列的“0000-00-00 00:00:00”

如何解析0000-00-00 00:00:00?

0000-00-00 00:00:00在时间戳

如何在PHP中正确设置“ 0000-00-00 00:00:00”作为DateTime

当DateTime设置为0000-00-00 00:00:00时,MySQL选择MIN DateTime

如何在Python中初始化datetime 0000-00-00 00:00:00?

mysql datetime在mysql版本5.6中变为0000-00-00 00:00:00

在Mysql数据库中将0000-00-00 00:00:00插入到DateTime

如何将字段的默认值设置为“ 0000-00-00 00:00:00”?

MySQL导入将时间戳的空值转换为0000-00-00 00:00:00

无法将DateTimeField的默认值设置为“ 0000-00-00 00:00:00”

00:00:00 DateTime.ToString变为12:00:00

util.JDBCExceptionReporter值'0000-00-00 00:00:00'不能表示为java.sql.Timestamp

获取异常,例如“无法将值'0000-00-00 00:00:00'从第12列转换为TIMESTAMP”

如何将具有0000-00-00 00:00:00值的日期时间设置为NULL?

如何在格式为'0000-00-00T00:00:00 + 00:00'的字符串上使用datetime.strptime?

PHP-使用STR_TO_DATE更新datetime列,但它更新了空记录,例如“ 0000-00-00 00:00:00”

momentjs 格式返回 0000-00-00

无法将'0000-00-00 00:00:00'转换为TIMESTAMP

PostgreSQL中更换 “0000-00-00 00:00:00” 为NULL

如何使用javascript获取当前时间为00/00/0000 00:00:00

如何将时间“0000-00-00 00:00:00”设置为LocalDateTime?

'0000-00-00 00:00:00'不能表示为java.sql.Timestamp错误

将 PHP DateTimeInterface 保存到 MySQL 结果为 0000-00-00 00:00:00

具有“ 0000-00-00 00:00:00”格式的Doctrine2默认时间戳?

如何在python中使用strftime()格式化'0000-00-00 00:00:00'?

Java解析JSON与LocalDateTime 0000-00-00 00:00:00

为什么 SQL 会将表中的日期更新为 0000-00-00 00:00:00?