잘못된 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
'programing' 카테고리의 다른 글
| Java: 최대 공약수 가져오기 (0) | 2023.01.24 |
|---|---|
| MariaDB vs Drizle vs Percona Server vs MySQL (0) | 2023.01.24 |
| Python Panda에서 여러 열에 걸쳐 중복된 모든 행 삭제 (0) | 2023.01.15 |
| MySQL에서 데이터베이스 간에 테이블 이동 (0) | 2023.01.15 |
| 휘발성이 높은가요? (0) | 2023.01.15 |