SQL Server - 日期比较不起作用,除非日期是硬编码的

时间:2018-06-05 09:55:02

标签: sql sql-server

我正在编写SQL服务器存储过程,我在日期比较中面临一些问题。如果我在where子句中使用变量 @mydate ,则查询不返回任何值,但如果我对日期进行硬编码则返回。

SQL Server查询 -

declare @mydate date = null;
select @mydate  = t1.ResetDate 
from my_table t1 
where ID = 101;

Select * 
from my_another_table t2 
where t2.MyDateRange between @mydate and GETUTCDATE();

PS:我只在我的存储过程中发布了简单的查询。

修改

DECLARE
 @ResetDate date = '2018-05-31';     
select * from my_another_table t2     
where t2.MyDateRange>= @ResetDate AND t2.MyDateRange < = dateadd(day, 1, 
cast(GETUTCDATE() as date))

在上面的查询中如果我将where子句的日期值硬编码为其返回值,但是如果我放置@ResetDate则不返回任何内容。

1 个答案:

答案 0 :(得分:1)

尽量不要使用betweenGETUTCDATE() - 尽管名称 - 返回datetime。因此,建议使用这样的结构:

declare @mydate date = null;

select @mydate = t1.ResetDate from my_table t1 where ID = 101;

Select *
from my_another_table t2 
where t2.MyDateRange >= @mydate and
      t2.MyDateRange < dateadd(day, 1, cast(GETUTCDATE() as date));

Aaron Bertrand非常好blog解释了为什么你不想将BETWEEN用于日期/时间类型。

我还应该注意,你可以在不使用变量的情况下表达这一点(无论日期比较逻辑如何):

Select t2.*
from my_another_table t2 join
     my_table_t1 t1
     on t2.MyDateRange >= @mydate and
        t2.MyDateRange < dateadd(day, 1, cast(GETUTCDATE() as date))
where t1.ID = 101