如何在子句之间使用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假设您的所有日期都是dd-MM-yyyy格式,但如果有无效的日期,则不会导致错误。

或者,如果可以的话,可以添加一个计算列并对其进行索引

ALTER TABLE YourTable ADD DateDate AS TRY_CONVERT(date,[DATE],105) PERSISTED;

然后(添加索引后(您可以查询该列:

SELECT *
FROM YourTable
WHERE DateDate BETWEEN '20181210' AND '20181211';

最新更新