简体   繁体   中英

How to get list of 2nd and 4th Saturday dates in SQL Server?

I am almost a newbie to writing SQL queries. In the context of SQL Server, how to get list of 2nd and 4th Saturday dates in the year 2016?

Done as a derived table simply to show the logic but you can reduce if you prefer:

select *
from (
    select d2016, 
           datename( weekday, d2016 ) as wkdy,
           row_number( ) over ( partition by datepart( month, d2016 ), datename( weekday, d2016 ) order by d2016 ) as rn_dy_mth
    from (
        select dateadd( day, rn, cast( '2016-01-01' as date ) ) as d2016
        from (
            select row_number() over( order by object_id ) - 1 as rn
            from sys.columns
            ) as rn
        ) as dy
    ) as dy_mth
where rn_dy_mth in ( 2, 4 )
  and wkdy = 'Saturday' 
order by d2016
--DEFINE LIMITS FOR DAY
DECLARE @TODATE DATETIME, @FROMDATE DATETIME
SET @FROMDATE ='2010-01-01'
SET @TODATE = '2017-12-31'

;WITH DATESEQUENCE( [DATE] ) AS
(
    SELECT @FROMDATE AS [DATE]
        UNION ALL
    SELECT DATEADD(DAY, 1, [DATE])
        FROM DATESEQUENCE
        WHERE DATE < @TODATE
    )
, DATESATURDAY AS
(SELECT CAST(CAST(YEAR([DATE]) AS VARCHAR)+ 
       (CASE WHEN DATEPART(M,[DATE])<=9 THEN '0'+CAST(DATEPART(M,[DATE]) AS VARCHAR)
       ELSE CAST(DATEPART(M,[DATE]) AS VARCHAR) END ) AS NUMERIC)  AS MONTH_ID

        ,CONVERT(VARCHAR,[DATE],106) AS DAY_DESC

       ,UPPER(DATENAME(DW,[DATE]))AS DAY_NAME
FROM DATESEQUENCE )
,SECOND_FOURTH_SATURDAY AS
(SELECT *
,ROW_NUMBER() OVER (PARTITION BY MONTH_ID ORDER BY DAY_NAME) FALL_IN
FROM DATESATURDAY
WHERE DAY_NAME='SATURDAY')
SELECT * FROM SECOND_FOURTH_SATURDAY
WHERE FALL_IN IN(2,4)
OPTION (MAXRECURSION 10000)

You can get any Saturday of a month using the Following Query in SQL. Here I'm Getting on Current Date, You can set your own selected date to get a Specific month Saturday

select DATEADD(dd, (14 - @@DATEFIRST - DATEPART(dw, DATEADD(MONTH, DATEDIFF(mm, 0,getdate()), 0))) % 7, DATEADD(MONTH, DATEDIFF(mm, 0, getdate()), 0)) as FirstSaturday,
DATEADD(dd,7,DATEADD(dd, (14 - @@DATEFIRST - DATEPART(dw, DATEADD(MONTH, DATEDIFF(mm, 0, getdate()), 0))) % 7, DATEADD(MONTH, DATEDIFF(mm, 0, getdate()), 0))) as SecondSaturday,
DATEADD(dd,14,DATEADD(dd, (14 - @@DATEFIRST - DATEPART(dw, DATEADD(MONTH, DATEDIFF(mm, 0, getdate()), 0))) % 7, DATEADD(MONTH, DATEDIFF(mm, 0, getdate()), 0))) as ThirdSaturday,
DATEADD(dd,21,DATEADD(dd, (14 - @@DATEFIRST - DATEPART(dw, DATEADD(MONTH, DATEDIFF(mm, 0, getdate()), 0))) % 7, DATEADD(MONTH, DATEDIFF(mm, 0, getdate()), 0))) as LastSaturday

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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