从字符串和日期字段构建日期,然后与另一个日期进行比较。 SQL

时间:2018-08-13 13:06:31

标签: sql sql-server-2008

我正在尝试比较日期,这是SQL中where子句的一部分。 一个日期称为ExitDate,是标准的DateTime字段。 另一个日期是需要从名为Renewal的varchar(5)字段中提取的日期,该字段保留日期的“ dd / mm”部分。

我需要进行的比较是从ExitDate中获取“年”,在“续订”字段中添加“ dd / mm”字符串,然后将该日期与整个Exitdate进行比较。

在此之后,有时会采用上述综合日期,然后再根据协作结果将其加4或5年。

到目前为止,我有代码从EXITDATE字段中提取年份,将其转换为字符串,在该RENEWAL字段上添加“ dd / mm”字符串,然后将其转换回日期以进行比较。比较之后,它会再次执行此操作,但是还具有DATEADD函数,将年份添加到日期中。

AND ed.EXITDATE is not null
and s.EDATE > case when 
convert(datetime,(p.RENEWAL + '/' + convert(varchar(4),YEAR(ed.exitdate))),102) > ed.exitdate
then DATEADD(year,-5,convert(datetime,(p.RENEWAL + '/' + convert(varchar(4),YEAR(ed.exitdate))),102))
else DATEADD(year,-4,convert(datetime,(p.RENEWAL + '/' + convert(varchar(4),YEAR(ed.exitdate))),102)) end

我目前收到错误消息:将varchar数据类型转换为datetime数据类型导致值超出范围。

是否有一种更简便的方法?或者我是否从转换中丢失了会导致此问题的内容?

编辑:

在此提供帮助的是所涉及表的示例 涉及的所有日期均为dd / mm / yyyy

Table ED
ID      |EXITDATE(datetime)
1       |01/05/2018
2       |06/10/2018

Table Renewal
Scheme  |RENEWAL(VARCHAR(5))
1       |02/06
2       |04/08

Table s
SalNo   |ID   |EDATE
1       |1    |02/05/2015
2       |1    |02/05/2016
3       |1    |02/05/2017
4       |1    |02/05/2018
1       |2    |18/05/2015
2       |2    |18/05/2016
3       |2    |18/05/2017
4       |2    |18/05/2018

我希望从EXITDATE Match中提取ID = Scheme的年份并将两个字符串加在一起;即。 ID1将产生2018年6月6日,ID2将产生04/08/2018,并将其与原始退出日期进行比较。

亲切的问候

马特

1 个答案:

答案 0 :(得分:1)

根据数据,您应该使用103而不是102。请参阅here