MS SQL 算术溢出后日期时间比较后在 where 子句中



>我在MS SQL Server 2014上使用日期比较时遇到了一个奇怪的问题。

SELECT * FROM (SELECT AKTDET.*, DATEDIFF(day,aktdet.Bezahlt_am, getdate()- 50) as datumsdifferenz FROM (SELECT  Convert(datetime,AKTDET.von_num - 2.0,121) as [Bezahlt_am], AKT.KENNUNG, AKTDET.* FROM AKT INNER JOIN AKTDET ON AKT.DSN = AKTDET.AKT_DSN Inner JOin FLDART ON AKTDET.Fldart_Dsn = FLDART.DSN WHERE FLDART.Kürzel = 'bezahlt am') AS AKTDET ) AS AKTDET WHERE datumsdifferenz > 0.0

每次都失败,"Arithmetischer Überlauffehler beim Konvertieren von expression in den datetime-Datentyp"翻译:"将表达式转换为日期时间数据类型时的算术溢出错误"。

如果我不使用 where 子句,一切都很好。 怎么会这样?

SELECT * FROM (SELECT AKTDET.*, DATEDIFF(day,aktdet.Bezahlt_am, getdate()- 50) as datumsdifferenz FROM (SELECT  Convert(datetime,AKTDET.von_num - 2.0,121) as [Bezahlt_am], AKT.KENNUNG, AKTDET.* FROM AKT INNER JOIN AKTDET ON AKT.DSN = AKTDET.AKT_DSN Inner JOin FLDART ON AKTDET.Fldart_Dsn = FLDART.DSN WHERE FLDART.Kürzel = 'bezahlt am') AS AKTDET ) AS AKTDET

数据似乎完全正确。 所有值都是非常正确的日期值。下面是行的示例:

datumsdifferenz Bezahlt_am  KENNUNG     AKT_DSN
700 2016-12-21 00:00:00.000        340  690837DC-C521-47A7-B845-0B3036CADA07
391 2017-10-26 00:00:00.000       1887  27BC0276-0FAF-4787-BC69-4F7CC8F4D44A
391 2017-10-26 00:00:00.000       1887  27BC0276-0FAF-4787-BC69-4F7CC8F4D44A
392 2017-10-25 00:00:00.000       1890  102CA803-8EA7-48CB-95AE-AA2F8F686715

如果我使用 select top 80... WHERE datumsdifferenz > 0.0此外,一切都会正常。

如果我使用 select top 90... WHERE datumsdifferenz > 0.0它将再次抛出这些奇怪的错误。

如果我使用临时表并在之后进行比较,它会起作用吗?!

我为自己找到了解决方案。 如果我使用 where 子句,查询优化器首先会使用 CONVERT 进行整个表扫描。

FLDART_DSN = 的子查询(从 FLDART 中选择前 1 个 DSN,其中 FLDART。Kürzel = 'bezahlt am') 将在外部 where 子句之后处理。在这种情况下,将扫描整个表。但该表包含的数据不是日期值。这就是为什么在外部 where 子句的情况下转换会失败的原因。

溶液:

SELECT * FROM (SELECT case When von_num < 90000.0 AND von_num > -400000.0 then convert(datetime,VON_NUM,104) END as bezahlt_am, *  FROM (SELECT  * FROM _TEST WHERE FLDART_DSN = (SELECT TOP 1 DSN FROM FLDART WHERE FLDART.Kürzel = 'bezahlt am')) as test) as test WHERE FLDART_DSN = (SELECT TOP 1 DSN FROM FLDART WHERE FLDART.Kürzel = 'bezahlt am') AND bezahlt_am  > GETDATE() - 100.0
SELECT convert(datetime,90000.0,104) -- 2146-05-31 00:00:00.000
SELECT convert(datetime,-40000.0,104) -- 1790-06-26 00:00:00.000

相关内容

  • 没有找到相关文章

最新更新