programing

잘못된 DateTime 값 '0000-00 00:00:00' - Date_Sub()가 있는 경우

goodjava 2023. 1. 24. 08:10

잘못된 DateTime 값 '0000-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 모드가 사용되도록 설정되었으며, 0일 또는 일부 날짜는 허용되지 않습니다.그래서 이게 당신의 원인일 수 있습니다.INSERT'0000-00-00 00:00:00'은 실패합니다.

SQL 모드를 확인하려면 다음 작업을 수행합니다.

SELECT @@sql_mode;

그리고 만약 어떤 것이라도NO_ZERO_DATE또는NO_ZERO_IN_DATE설정되면 다음 작업을 수행할 수 있습니다.

SET sql_mode = '';

두 번째 옵션

또 다른 선택사항은 이 시스템이 실패했다는 것입니다.STRICT_TRANS_TABLESmysql 매뉴얼에 기재되어 있는 대로:

strict 모드는 서버가 '0000-00-00'을 유효 날짜로 허용하는지 여부에 영향을 줍니다.strict 모드가 활성화되지 않은 경우 '0000-00-00'이 허용되며 삽입 시 경고가 발생하지 않습니다.strict 모드가 유효하게 되어 있는 경우는, IGNORE 가 지정되어 있지 않는 한, 「0000-00-00」이 허가되지 않고, 삽입에 에러가 발생합니다.INSERT IGNORE 및 UPDATE IGNORE의 경우 '0000-00-00'이 허용되며 삽입 시 경고가 발생합니다.

datetime에도 마찬가지입니다.

따라서 STRICT MODE를 비활성화하거나 비활성화할 수 없는 경우 쿼리를 수정하여 잘못된 날짜/날짜 결과를 반환하지 않도록 해야 합니다.

쿼리 전에 이 코드 입력

SET sql_mode = '';

또는 로 이동합니다./etc/mysql/my.cnf코멘트 아웃(comment out)STRICT_TRANS_TABLES

유용한 메모 SQL Strict 모드

언급URL : https://stackoverflow.com/questions/40425568/incorrect-datetime-value-0000-00-00-000000-date-sub-in-having