web-dev-qa-db-ja.com

不正なDateTime値 '0000-00-00 00:00:00'-Date_Sub()in Have

だから私はこのようなインサートを持っています:

  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'。私はそれを絞り込みました、そして私が持っている節からこの行を削除すると(DATE_ADD(MAX(COALESCE(InvoiceDate, NOW())) <= MIN(COALESCE(InvoiceDate, NOW())), INTERVAL -30 DAY)) できます。

実際、インサートを奇妙に外すと機能します。

選択は何も返しませんが、それでも失敗します。

どうしてこれなの?誰かが理由を見つけるのを手伝ってくれる?

5
Andrew Kilburn

最初のオプション:

この警告は、おそらくSQL_MODEが原因である可能性があります。

Mysqlのドキュメントによると、「NO_ZERO_DATEまたはNO_ZERO_IN_DATE SQLモードが有効になっている場合、ゼロの日付または日付の一部は許可されません。」したがって、これが「0000-00-0000:00:00」のINSERTが失敗する原因である可能性があります。

これを実行することにより、SQLモードを確認できます。

SELECT @@sql_mode;

NO_ZERO_DATEまたはNO_ZERO_IN_DATEのいずれかが設定されている場合は、次のことができます。

SET sql_mode = '';

2番目のオプション

もう1つのオプションは、STRICT_TRANS_TABLESモードが原因で失敗することです。 mysqlのドキュメントにあるように:

厳密モードは、サーバーが有効な日付として「0000-00-00」を許可するかどうかに影響します。厳密モードが有効になっていない場合、「0000-00-00」が許可され、挿入によって警告が生成されません。 strictモードが有効になっている場合、IGNOREも指定されていない限り、「0000-00-00」は許可されず、挿入によってエラーが発生します。 INSERTIGNOREおよびUPDATEIGNOREの場合、「0000-00-00」が許可され、挿入によって警告が生成されます。

日時についても同様です。

したがって、STRICT MODEを無効にする必要があります[〜#〜]または[〜#〜]無効にすることがオプションでない場合-無効な日付/日時の結果を返さないようにクエリを変更します

16
krasipenkov

このコードをクエリの前に置く

SET sql_mode = '';

または、/etc/mysql/my.cnfに移動して、STRICT_TRANS_TABLESをコメントアウトします。

便利なメモSQL STRICT MODE

3
AZinkey