Sql server 如何获得上个月的第三个星期四

Sql server 如何获得上个月的第三个星期四,sql-server,sql-server-2008,Sql Server,Sql Server 2008,我的报表生成器应该可以获取上个月第三个星期四的所有条目。 如何在ms sql server中实现这一点?您可以使用以下内容: WHERE DATEPART(dw,[YourDateColumn]) = 5 -- Thursday AND DATEPART(d,[YourDateColumn]) BETWEEN 15 AND 21 -- Third thursday in month AND DATEDIFF(m,GETDATE(),[YourDateColumn]

我的报表生成器应该可以获取上个月第三个星期四的所有条目。
如何在ms sql server中实现这一点?

您可以使用以下内容:

WHERE DATEPART(dw,[YourDateColumn]) = 5              -- Thursday
 AND DATEPART(d,[YourDateColumn]) BETWEEN 15 AND 21  -- Third thursday in month
 AND DATEDIFF(m,GETDATE(),[YourDateColumn])=-1       -- Last month
但是您需要知道,由于函数的原因,查询可能会很慢。

另请参见:

您可以使用以下内容:

WHERE DATEPART(dw,[YourDateColumn]) = 5              -- Thursday
 AND DATEPART(d,[YourDateColumn]) BETWEEN 15 AND 21  -- Third thursday in month
 AND DATEDIFF(m,GETDATE(),[YourDateColumn])=-1       -- Last month
但是您需要知道,由于函数的原因,查询可能会很慢。

另请参见:

,类似的内容在日历桌上更容易实现。看


像这样的东西,有了日历桌就容易多了。看


下面的代码查找上个月的第三个星期四 (last=previous或last=current?如果last=current,则用getdate()替换dateadd(月份,-1,getdate())

您可以将其包装到函数中,并在查询的WHERE子句中使用 或者在使用变量进行过滤之前计算, 因此,您的查询将如下所示

SELECT...WHERE dt >= fn() 

因此,可以使用索引(如果有的话)

with nums as -- numbers 1..31
(
select number as n
from master..spt_values
where type = 'p'
and number between 0 and 30
)


, thur as
(
select dt,
       dd,
       ROW_NUMBER() over (order by dt) as rn
from nums cross apply 
                    (
                    select cast(convert(char(6), dateadd (month, -1, getdate()), 112) + '01' as date) as dt0 -- the first of last month
                    )a
          cross apply( select dateadd(day, n, dt0) as dt) a1
          cross apply( select datename(dw, dt) as dd, month(dt) as mm) a2
where dd = 'Thursday' and mm = month(dt0) 
)

select dt
from thur
where rn = 3;

下面的代码查找上个月的第三个星期四 (last=previous或last=current?如果last=current,则用getdate()替换dateadd(月份,-1,getdate())

您可以将其包装到函数中,并在查询的WHERE子句中使用 或者在使用变量进行过滤之前计算, 因此,您的查询将如下所示

SELECT...WHERE dt >= fn() 

因此,可以使用索引(如果有的话)

with nums as -- numbers 1..31
(
select number as n
from master..spt_values
where type = 'p'
and number between 0 and 30
)


, thur as
(
select dt,
       dd,
       ROW_NUMBER() over (order by dt) as rn
from nums cross apply 
                    (
                    select cast(convert(char(6), dateadd (month, -1, getdate()), 112) + '01' as date) as dt0 -- the first of last month
                    )a
          cross apply( select dateadd(day, n, dt0) as dt) a1
          cross apply( select datename(dw, dt) as dd, month(dt) as mm) a2
where dd = 'Thursday' and mm = month(dt0) 
)

select dt
from thur
where rn = 3;

请,显示简单数据,所需输出请,显示简单数据,所需输出