Tsql 日期与时间之间的T-SQL

Tsql 日期与时间之间的T-SQL,tsql,Tsql,我有下面的Where条款,这是造成我的问题,我正在寻找一个解决办法 @startDate是今天的日期,@endDate是结束日期,将来可能是7天、14天或20天,除非结束月份大于开始月份,否则此操作正常 问题-如果开始日期为20,结束日期为下个月,例如开始日期为10/21,结束日期为11/5,则where条款会取消其自身输出,我不能使用中间日期,因为我们不包括yr。 我试过手术室,但这也不起作用 WHERE DAY(t.AnniversaryDate) >= DAY(@startD

我有下面的Where条款,这是造成我的问题,我正在寻找一个解决办法

@startDate是今天的日期,@endDate是结束日期,将来可能是7天、14天或20天,除非结束月份大于开始月份,否则此操作正常

问题-如果开始日期为20,结束日期为下个月,例如开始日期为10/21,结束日期为11/5,则where条款会取消其自身输出,我不能使用中间日期,因为我们不包括yr。 我试过手术室,但这也不起作用

 WHERE    DAY(t.AnniversaryDate) >= DAY(@startDate) 
            AND DAY(t.AnniversaryDate) <= DAY(@endDate)
            AND MONTH(t.AnniversaryDate) >= MONTH(@startDate)
            AND MONTH(t.AnniversaryDate) <= MONTH(@endDate)
            AND YEAR(t.AnniversaryDate) < YEAR(GETDATE())
表情

select DATEADD(year,DATEDIFF(year,'19780517',GETDATE()),'19780517')
将始终在当年5月17日返回。通过将“19780517”的两个实例替换为感兴趣的日期,可以使用类似的表达式对任何日期1执行相同的操作

所以,无论什么,我不能使用中间值,因为我们不包括yr的意思,你应该能够通过使用上面的表达式来解决它

所以,我想你想要的是:

WHERE    DATEADD(year,
         DATEDIFF(year,t.AnniversaryDate,GETDATE()),
                       t.AnniversaryDate)
         BETWEEN @startDate and @endDate

1只要你高兴,如果你在非闰年要求2月29日映射到2月28日。

描述你想要实现的目标。目前看来,我希望能够在两个日期之间进行搜索,而不包括yr.Share示例数据+所需输出。只要将来的日期具有相同的月份,SQL就可以完美地工作。只有当结束日期的月份发生变化时,才会返回日期列表。例如,我想做的是搜索Anniversarydate,其中有一个YR和介于StartDate和EndDate之间的,没有YR的。我可以建议您更改逻辑,将函数仅应用于变量端,而不应用于列,因为该列中的任何索引都会因此查询而受阻performance@Jean-是的,如果您需要索引,您必须在这里选择一个变体。如果考虑到查询的性质,就无法避免对列进行计算,但您要做的是创建一个计算列,通过更改表达式的GETDATE部分,将所有日期规范化为一年,例如1978年或2001年,然后对该列编制索引。完成后,您可以使用索引查询它,但您必须将开始日期和结束日期值规范化为同一年。我的错。是的,你需要去掉变量和无用的年份部分,因为它只会造成不匹配。我发现这在新年的12-20-1-5日不起作用?