我有一个包含以下列的表:
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假设您的所有日期都是dd-MM-yyyy
格式,但如果有无效的日期,则不会导致错误。
或者,如果可以的话,可以添加一个计算列并对其进行索引
ALTER TABLE YourTable ADD DateDate AS TRY_CONVERT(date,[DATE],105) PERSISTED;
然后(添加索引后(您可以查询该列:
SELECT *
FROM YourTable
WHERE DateDate BETWEEN '20181210' AND '20181211';