首页 > 解决方案 > 如何在 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。

标签: sql-servertsql

解决方案


如果您“必须”(没有理由不能)更改数据类型,则必须转换列的值。这将付出巨大的代价,因为您的查询将不再是 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';

推荐阅读