SQL Server 2012:比较和减去联接中的日期

时间:2018-07-02 13:22:33

标签: sql date sql-server-2012 dateadd

我想获得最近30天内的联接查询结果。

V.[4501001]包含格式为dd/mm/yyyy的nvarchar日期

这是我的查询:

(select Distinct T.PId from [dbo].[TrialStatus] T inner join 
    form.TP_VISDATE V on T.pid = V.pid
    where T.cid = 1064 and T.sid = 300 and (Convert(NVARCHAR, V.[4501001], 103) < Convert(NVARCHAR,GETDATE(),103)) and (Convert(NVARCHAR, V.[4501001], 103) > DATEADD(DD,-30,Convert(NVARCHAR,GETDATE(),103))))

如果我使用Convert(NVARCHAR,GETDATE(),103),我会得到错误的结果,因为

select DATEADD(Day,-30,Convert(NVARCHAR,GETDATE(),103))

返回2018-01-08 00:00:00.000,而不是今天前30天

但是如果我不经转换就按原样使用GETDATE(),则会出现此错误:

  

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

1 个答案:

答案 0 :(得分:0)

将值转换为日期,而不是字符串!

select Distinct T.PId
from [dbo].[TrialStatus] T inner join 
     form.TP_VISDATE V 
     on T.pid = V.pid
where T.cid = 1064 and
      T.sid = 300 and
      Convert(date, V.[4501001], 103) < Convert(date, GETDATE()) and
      Convert(date, V.[4501001], 103) > DATEADD(day, -30, Convert(date, GETDATE()));

然后,您可以修复表中的数据。不要将日期存储为字符串。使用本机类型存储它们。