比较存储为 varchar 的日期

Jos*_*per 1 sql-server datetime date

我需要将数据库中存储为 varchar 的日期与今天的日期进行比较。

具体来说,我需要排除任何日期已过的记录。

我试过:

SELECT * FROM tblServiceUsersSchedule 
WHERE ScheduleEndDate !='' AND ScheduleEndDate < '2015/05/31'
Run Code Online (Sandbox Code Playgroud)

此选择的值例如 17/06/ 2012和 19/04/2015 都已通过,以及 01/06/2015 尚未通过。

然后我尝试使用以下方法转换数据:

SELECT * 
FROM   tblServiceUsersSchedule 
WHERE  CAST(ScheduleEndDate as DATETIME)  < CAST('05/31/2015' as DATETIME) AND ScheduleEndDate !='' AND ScheduleEndDate is not null
Run Code Online (Sandbox Code Playgroud)

但出现以下错误:

varchar 数据类型到 datetime 数据类型的转换导致值超出范围。

我检查了后面的数据,没有一个是空的,没有一个是空白。所有日期均采用 dd/mm/yyyy 格式。

我不知道如何将存储的 varchar 日期与今天的日期进行比较。

Zoh*_*led 5

将日期值存储为 varchar 是完全错误的。

如果可能,您应该更改表以将它们存储为日期数据类型。
您可以通过几个简单的步骤来完成:

  1. 将当前列(我猜 ScheduleStartDate 也是 varchar)重命名为 columnName_old。这可以通过使用轻松完成sp_rename

  2. 用于alter table添加具有适当数据类型的列。

  3. 使用更新语句将值从旧列复制到新列。由于所有日期都以相同的格式存储,因此您可以convert像这样使用: set ScheduleStartDate = convert(date, NULLIF(ltrim(rtrim(ScheduleStartDate_old)), ''), 103)如果您的 sql server 版本是 2012 或更高版本,请使用try_convert. 请注意,我使用nullif,ltrimrtrim将仅包含空格的值转换为 null。
  4. 删除并重新创建引用这些列的索引。最简单的方法是右键单击 SSMS 上的索引并选择script index as-> drop and create
  5. 用于alter table删除旧列。

注意:如果数据库上的任何其他对象引用这些列,您也必须更改这些对象。这包括存储过程、外键等。

如果您无法更改列的数据类型,并且您的sql server版本低于2012,则需要像这样使用convert:

SELECT * FROM tblServiceUsersSchedule 
WHERE CONVERT(DATE, NULLIF(ScheduleEndDate, RTRIM(LTRIM('')), 103) 
      < CAST(GETDATE() As Date);
AND ScheduleEndDate IS NOT NULL
Run Code Online (Sandbox Code Playgroud)

请注意,即使只有一行,其中列的数据不是 dd/MM/yyyy 格式,这也会引发错误。

对于 sql server 2012 或更高版本,请使用Try_convert. 如果转换失败,此函数将简单地返回 null:

SELECT * FROM tblServiceUsersSchedule 
WHERE TRY_CONVERT(DATE, NULLIF(ScheduleEndDate, RTRIM(LTRIM('')), 103)
      < CAST(GETDATE() As Date);
AND ScheduleEndDate IS NOT NULL
Run Code Online (Sandbox Code Playgroud)

注意:我曾经CAST(GETDATE() as Date)删除当前日期的时间部分。这意味着您只能获得ScheduleEndDate至少一天前的记录。如果您还想获取ScheduleEndDate今天所在的记录,请使用<=代替<

最后一件事:在 where 子句中的列上使用函数将阻止 Sql Server 在这些列上使用任何索引。
这是您应该将列更改为适当的数据类型的另一个原因。