sql-server – 比较存储为varchar的日期
我需要将存储在我的数据库中的日期作为varchar与今天的日期进行比较.
具体来说,我需要排除任何已经过了日期的记录. 我试过了: SELECT * FROM tblServiceUsersSchedule WHERE ScheduleEndDate !='' AND ScheduleEndDate < '2015/05/31' 这个选定的值,如17/06/2012和19/04/2015,已经通过,以及2015年6月1日尚未通过. 然后我尝试使用以下方式转换数据: SELECT * FROM tblServiceUsersSchedule WHERE CAST(ScheduleEndDate as DATETIME) < CAST('05/31/2015' as DATETIME) AND ScheduleEndDate !='' AND ScheduleEndDate is not null 但得到以下错误:
我检查了后面的数据,没有一个是null,没有空白空格.所有日期格式为dd / mm / yyyy. 我无法弄清楚如何比较存储与今天日期的varchar日期. 解决方法将日期值存储为varchar是完全错误的.如果可能,您应该更改表以将它们存储为日期数据类型. >将当前列(我猜测ScheduleStartDate也是varchar)重命名为columnName_old.这可以通过使用 注意:如果在数据库的任何其他对象中引用这些列,则还必须更改这些对象.这包括存储过程,外键等. 如果您无法更改列的数据类型,并且您的sql server版本低于2012,则需要使用如下转换: SELECT * FROM tblServiceUsersSchedule WHERE CONVERT(DATE,NULLIF(ScheduleEndDate,RTRIM(LTRIM('')),103) < CAST(GETDATE() As Date); AND ScheduleEndDate IS NOT NULL 请注意,如果您的列的数据不是dd / MM / yyyy格式的单行,则会引发错误. 对于sql server版本2012或更高版本,请使用Try_convert.如果转换失败,此函数将返回null: SELECT * FROM tblServiceUsersSchedule WHERE TRY_CONVERT(DATE,103) < CAST(GETDATE() As Date); AND ScheduleEndDate IS NOT NULL 注意:我使用CAST(GETDATE()作为日期)来删除当前日期的时间部分.这意味着您只能获得ScheduleEndDate至少有一天的记录.如果您还想获取今天ScheduleEndDate所在的记录,请使用< =而不是<. 最后一件事:在where子句中使用列上的函数将阻止Sql Server对这些列使用任何索引.这是您应将列更改为适当数据类型的另一个原因. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |