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 日期与今天的日期进行比较。
将日期值存储为 varchar 是完全错误的。
如果可能,您应该更改表以将它们存储为日期数据类型。
您可以通过几个简单的步骤来完成:
将当前列(我猜 ScheduleStartDate 也是 varchar)重命名为 columnName_old。这可以通过使用轻松完成sp_rename。
用于alter table添加具有适当数据类型的列。
convert像这样使用: set ScheduleStartDate = convert(date, NULLIF(ltrim(rtrim(ScheduleStartDate_old)), ''), 103)如果您的 sql server 版本是 2012 或更高版本,请使用try_convert. 请注意,我使用nullif,ltrim和rtrim将仅包含空格的值转换为 null。script index as-> drop and create。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 在这些列上使用任何索引。
这是您应该将列更改为适当的数据类型的另一个原因。