sql-server - SQL Server 将硬编码日期确定为更大的日期?
问题描述
一位老员工留下了我一直在调试的大量查询,看来问题已归结为 SQL Server 本身确定的比较与我预期的不同。
我有一个表,其中有一列col1
包含20191215
作为日期时间的值。
有问题的部分类似于以下内容:
select case when col1 > '01/01/2020' then 1 else 0 end
此语句正在返回1
,提示'12/15/2019'
大于'01/01/2020'
。
我不需要帮助来更正查询,因为我已经进行了更改,而不是使用以前的员工使用的比较,我只是好奇为什么 SQL Server 会像我所描述的那样评估这个。
我知道这也不是 SQL Server 存储日期的典型方式,问题仅仅是日期的格式吗?
当前 SQL Server 版本是:SQL Server 2014 SP3 CU3
。
请注意,该链接不包含我的案例的精确副本
编辑:包括与实际查询相关的附加信息。
解决方案
这是字符串比较而不是日期比较:
select case when '12/15/2019' > '01/01/2020' then 1 else 0 end
vs
select case when CAST('12/15/2019' AS DATE) > CAST('01/01/2020' AS DATE) then 1 else 0 end
我只是好奇为什么 SQL Server 会像我所描述的那样评估它。
'12/15/2019'
它是一个字符串文字,除非您明确表达您的意图,否则 SQL Server 不知道您要处理日期。
我有一个表 col1 包含值 20191216
如果要与列进行比较,则列的数据类型和数据类型优先级规则很重要
推荐阅读
- php - Laravel Raw 查询转换为 Eloquent ORM 格式
- python-3.x - 重复的日志 Flask - Google Cloud Logging
- c# - 如何按多个百分比调整此评估函数
- python - 如何可视化从 selenium 返回的 page_source
- node.js - 单击 Electron 应用程序中的按钮以在 VLC 中启动文件?
- r - GGPLOT 构面中的条形图和散点图
- php - 如何在 laravel 作业中格式化运行时错误消息 - laravel
- postgresql - 将 Docker 命令转换为 docker-compose.yml 时出错
- python - 如何使用多个分隔符拆分字符串(Python)
- python - 如何根据ec2资源实例获取public_dns_name?