【问题标题】:How to use varchar date field in between clause - SQL Server 2012如何在 between 子句中使用 varchar 日期字段 - SQL Server 2012
【发布时间】:2019-05-17 19:47:18
【问题描述】:

我有一个包含以下列的表格:

ID -> int
Name -> varchar
Date -> varchar

我想选择两个日期之间的值,如下所示:

SELECT * FROM table WHERE DATE BETWEEN '10-12-2018' AND '11-12-2018';

但是这个查询返回了错误的值,因为我在比较字符串。

我已经尝试在查询中将日期行转换为日期,但它不起作用。

我使用的是 SQL SERVER 2012。

【问题讨论】:

  • 样本数据和预期输出会很有帮助!
  • 为您的数据使用正确的数据类型,这不是问题。将您的列 [date] 更改为 date;为什么你会称一个列为“日期”,它是一个varchar..?
  • 不是因为你在比较字符串,而是因为日期格式不明确。 10-12-2018 可能是 10 月 12 日12 月 10 日,具体取决于日期格式
  • 问题是我改不了!我已经和我的老板谈过了,不可能改变!
  • 为什么不能改?他们的理由是什么?问题在于数据类型的选择。

标签: sql-server tsql


【解决方案1】:

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

【讨论】:

  • 只是附注 - Date 数据类型也将正确处理 ISO8601 字符串格式的更易读的可读性 - yyyy-mm-dd。 (DateTime 数据类型不会 - it will still depend on local settings)。
  • 这就是为什么我总是喜欢yyyyMMdd 格式@ZoharPeled。无论数据类型和语言设置如何,它都是完全明确的。
猜你喜欢
  • 2020-11-10
  • 2013-07-12
  • 2017-12-04
  • 1970-01-01
  • 2012-09-23
  • 2020-12-23
  • 1970-01-01
  • 2020-01-02
  • 1970-01-01
相关资源
最近更新 更多