所以我有一个插入看起来像这样:
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_DATE
或NO_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] 删除。
我来说两句