首页 > 解决方案 > SQL Server 条件下的日期和浮点数转换

问题描述

我需要帮助理解一点 SQL。

SELECT   * 
FROM [MyTable]  
WHERE CAST((GETDATE()-[MyDate]) as float) >= cast(0 as float) /24/60 
  AND CAST((GETDATE()-[MyDate]) as float) <  cast(499999 as float) /24/60  
  1. 我非常了解它是一个日期搜索,我没有得到的是浮点转换。你为什么要用那个?这对性能更好吗?

  2. 我知道第一个条件是:日期高于或与 1900/01/01 相同,我只是不明白什么是日期:499999/24/60为什么会有魔术师

感谢您的帮助和解释。

标签: sqlsql-server

解决方案


将日期转换为浮点数是处理日期的一种老式方式。我认为它可能会回到 SQL Server 2000 中更有限的日期功能。但它也可能是熟悉 Excel 中日期(它们是浮点数)的人的遗产。

没有性能优势。事实上,这种类型转换阻止了索引的使用。

对于您的两项代码,我认为您想要:

WHERE MyDate >= CONVERT(DATE, GETDATE()) AND
      MyDate < DATEADD(DAY, 499999, '1899-12-30')

最后是任意的。一个常数值,例如:

WHERE MyDate >= CONVERT(DATE, GETDATE()) AND
      MyDate < '3000-01-01'

更有意义。您可以使用表示的实际日期'3268-12-11'-- 但这可能会使任何阅读代码的人感到困惑。

编辑:

在重新阅读这个问题时,这个逻辑比原来更没有意义。它似乎是这样的:

WHERE MyDate < CONVERT(DATE, GETDATE()) AND
      MyDate >= DATEADD(MINUTE, -499999, GETDATE())

这会导致溢出。


推荐阅读