我正在编写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则不返回任何内容。
答案 0 :(得分:1)
尽量不要使用between
。 GETUTCDATE()
- 尽管名称 - 返回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