sql-server - 如何在 between 子句中使用 varchar 日期字段 - SQL Server 2012
问题描述
我有一个包含以下列的表格:
ID -> int
Name -> varchar
Date -> varchar
我想选择两个日期之间的值,如下所示:
SELECT * FROM table WHERE DATE BETWEEN '10-12-2018' AND '11-12-2018';
但是此查询返回错误值,因为我正在与字符串进行比较。
我已经尝试在查询中将日期行转换为日期,但它不起作用。
我正在使用 SQL SERVER 2012。
解决方案
如果您“必须”(没有理由不能)更改数据类型,则必须转换列的值。这将付出巨大的代价,因为您的查询将不再是 SARGable(这意味着您拥有的任何索引都[DATE]
不会被使用)。
SELECT *
FROM YourTable
WHERE TRY_CONVERT(date,[DATE],105) BETWEEN '20181210' AND '20181211';
--Note the unambiguous date format for the literal strings
我使用TRY_CONVERT
样式 105 假设您的所有日期都采用 format dd-MM-yyyy
,但如果有任何无效的日期,则不会导致错误。
或者,如果可以,添加一个计算列并为其编制索引。您可以通过执行以下操作添加持久日期列:
ALTER TABLE YourTable ADD DateDate AS TRY_CONVERT(date,[DATE],105) PERSISTED;
然后(在添加索引之后)您可以查询该列:
SELECT *
FROM YourTable
WHERE DateDate BETWEEN '20181210' AND '20181211';
推荐阅读
- sql - 如何替换字符串中的值,除了最后一次出现在oracle中的特定值
- c++ - 如何更改 Excel DSN 的默认工作簿?
- sql - 存储过程中的选择和更新语句
- python-3.x - TypeError:“时间戳”对象不可下标
- python-3.x - 如何将情感分析脚本与聊天机器人集成以在同一控制台屏幕中分析用户的回复?
- firebase - 用户杀死应用程序时,firebase.notifications().getInitialNotification() 不起作用
- 8thwall-xr - 物体不在地面上生成
- java - Java - 将 XML 文件转换为 Docx 文件
- vb.net - 检查外部程序是否是活动窗口
- javascript - 如何在 odoo 11.0 中添加新的 javascript 文件并在加载 web/登录时调用脚本?