代码之家  ›  专栏  ›  技术社区  ›  aggicd

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

  •  0
  • aggicd  · 技术社区  · 8 年前

    我想得到这个连接查询在过去30天内的结果。

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

    我的问题是:

    (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 回复  |  直到 8 年前
        1
  •  0
  •   Gordon Linoff    8 年前

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

    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()));
    

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