sql - 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
我非常了解它是一个日期搜索,我没有得到的是浮点转换。你为什么要用那个?这对性能更好吗?
我知道第一个条件是:日期高于或与 1900/01/01 相同,我只是不明白什么是日期:499999/24/60,为什么会有魔术师?
感谢您的帮助和解释。
解决方案
将日期转换为浮点数是处理日期的一种老式方式。我认为它可能会回到 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())
这会导致溢出。
推荐阅读
- cookies - 如何从 Laravel 的 $request 中删除 cookie
- ruby-on-rails - 如何在 VSCode 中为 rails 添加环境变量到 launch.json
- javascript - 在 React/React Native 中,如何防止在选项卡更改、表单更改等时对已检索到的图像发出新的网络请求
- postgresql - 从 Python 容器连接到 postgres 时出错
- vba - 如何从不在活动演示文稿中的项目中保存模块(例如:加载项)
- c - 我们如何使用 meson-build 和 ninja 编译多个 c 文件?
- python - 删除不包含特定字符串的行的百分比
- docker - Dockerfile:bind9:无法识别的服务
- groovy - JMeter从字符串变量中删除单个字符
- weld - Weld SE:不在 Junit 测试中注入内部依赖