简体   繁体   English

从SQL Server 2008获取过去两个月的星期一

[英]Get Mondays of the last two months from SQL Server 2008

If today is 10 JULY 2015 then what I need is a record set in SQL Server which has the following records 如果今天是2015年7月10日,那么我需要的是SQL Server中的记录集,该记录集包含以下记录

 6 JULY 2015
29 JUNE 2015
22 JUNE 2015
15 JUNE 2015
 8 JUNE 2015
 1 JUNE 2015
25 MAY  2015

Try this 尝试这个

;WITH dates AS 
(
    SELECT CONVERT(datetime,cast(month(getdate())-2 as varchar(2))+'/'+cast(day(getdate()) as varchar(2))+'/'+ cast(year(getdate()) as varchar(4))) as Date,' ' as eid
    UNION ALL
    SELECT DATEADD(d,1,[Date]),' ' as eid
    FROM dates 
    WHERE DATE < GETDATE()
)
select  datename(DD,dates.date)+' '+datename(MM,dates.date)+' '+ datename(YYYY,dates.date) from dates
where datename(dw,dates.date) = 'Monday'

With the following expression you get the last Monday: 使用以下表达式,您可以获得最后一个星期一:

CAST(GETDATE()-(@@DATEFIRST-1+DATEPART(weekday,GETDATE())) % 7+1 AS DATE)

Here we use @@DATEFIRST and DATEPART(weekday,...) to find the last MONDAY. 在这里,我们使用@@ DATEFIRSTDATEPART(weekday,...)查找最后一个星期一。

Then you should generate 8 (two months) rows sequence of days each of them -7 days prior the next. 然后,您应该生成8天(两个月)的行序列,每行的天数为下一天的-7天。 Here I've used CTE but you can use UNION or TOP 8 rows from existing (system or user) in your DB table to generate 8 rows. 在这里,我使用了CTE,但是您可以使用DB表中现有(系统或用户)的UNION或TOP 8行来生成8行。

;WITH CT(n) AS
(
    SELECT 0
    UNION ALL
    SELECT n+1 FROM CT WHERE n < 7
)
SELECT DATEADD(DAY,-n*7,
      CAST(GETDATE()-
           (@@DATEFIRST-1+DATEPART(weekday,GETDATE())) % 7+1 AS DATE))  as DT 
FROM CT ORDER BY n

Sqlfiddle demo Sqlfiddle演示

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM