Как рассчитать воскресенье в месяце и выбрать третье? - PullRequest
1 голос
/ 29 марта 2019

У меня есть эта таблица:

 Date                  month                DayOfWeek
2014-01-01              1                        3
2014-01-02              1                        4 
2014-01-03              1                        5
2014-01-04              1                        6
2014-01-05              1                        7
......                .....                   .......
2014-02-01              2                        8
......                .....                    .....

Я хочу получить все третье воскресенье месяца так:

Date                 month                      
2014-01-19            1                             
2014-02-16            2                             

Я начал делать:

SELECT CAST(
        CASE
            WHEN [DayOfWeek] = 7
                THEN 1
            ELSE 0
        END AS bit) as Result, [date], [month]
FROM mytable

которые дают:

Result                   date                  month
0                       2014-01-01               1
0                       2014-01-02               1
0                       2014-01-03               1
0                       2014-01-04               1
1                       2014-01-05               1
....

Так что это дает мне все воскресенье, и моей первоначальной идеей было подсчитать, когда Результатом является 1 для каждого месяца, и получить дату третьего

Как я могу это сделать на сервере sql?

Ответы [ 4 ]

5 голосов
/ 29 марта 2019

Попробуй это.Третье воскресенье должно быть между 15-м и 21-м.

SELECT CAST(
        CASE
            WHEN [DayOfWeek] = 7 AND DatePart(day,[Date]) between 15 and 21
                THEN 1
            ELSE 0
        END AS bit) as Result, [date], [month]
FROM mytable
1 голос
/ 29 марта 2019

Примерно так должно работать:

select
    a.[Date],
    a.[Month]
from (
    select
        [Date],
        [DayOfWeek],
        ROW_NUMBER() over(partition by [DayOfWeek], [Month] order by [Date]) as DayOfWeekCount,
        [Month]
    from mytable
) a
where
    a.[DayOfWeek] = 7
    and a.DayOfWeekCount = 3

РЕДАКТИРОВАТЬ: только что увидел, что у вас уже есть DayOfWeek в качестве поля в вашей таблице, поэтому DATEPART вообще не нужен.

0 голосов
/ 29 марта 2019

Этого можно достичь, используя раздел row_number, как показано ниже.

Declare @table1 As table
    (
     Date varchar(14),
     month varchar(15),
     DayOfWeek varchar(15)
    )


BEGIN
Insert Into @table1(date,month,DayOfWeek) values('2014-01-01',1,1)
Insert Into @table1(date,month,DayOfWeek) values('2014-01-02',1,2)
Insert Into @table1(date,month,DayOfWeek) values('2014-01-03',1,3)
Insert Into @table1(date,month,DayOfWeek) values('2014-01-04',1,4)
Insert Into @table1(date,month,DayOfWeek) values('2014-01-05',1,1)
Insert Into @table1(date,month,DayOfWeek) values('2014-01-06',1,2)
Insert Into @table1(date,month,DayOfWeek) values('2014-01-07',1,3)
Insert Into @table1(date,month,DayOfWeek) values('2014-01-08',1,4)
Insert Into @table1(date,month,DayOfWeek) values('2014-01-11',1,1)
Insert Into @table1(date,month,DayOfWeek) values('2014-01-12',1,2)
Insert Into @table1(date,month,DayOfWeek) values('2014-01-13',1,3)
Insert Into @table1(date,month,DayOfWeek) values('2014-01-14',1,4)
Insert Into @table1(date,month,DayOfWeek) values('2014-01-15',1,1)
Insert Into @table1(date,month,DayOfWeek) values('2014-01-16',1,2)
Insert Into @table1(date,month,DayOfWeek) values('2014-01-17',1,3)
Insert Into @table1(date,month,DayOfWeek) values('2014-01-18',1,4)
Insert Into @table1(date,month,DayOfWeek) values('2014-02-01',2,1)
Insert Into @table1(date,month,DayOfWeek) values('2014-02-02',2,2)
Insert Into @table1(date,month,DayOfWeek) values('2014-02-03',2,3)
Insert Into @table1(date,month,DayOfWeek) values('2014-02-04',2,4)
Insert Into @table1(date,month,DayOfWeek) values('2014-02-05',2,1)
Insert Into @table1(date,month,DayOfWeek) values('2014-02-06',2,2)
Insert Into @table1(date,month,DayOfWeek) values('2014-02-07',2,3)
Insert Into @table1(date,month,DayOfWeek) values('2014-02-08',2,4)
Insert Into @table1(date,month,DayOfWeek) values('2014-02-11',2,1)
Insert Into @table1(date,month,DayOfWeek) values('2014-02-12',2,2)
Insert Into @table1(date,month,DayOfWeek) values('2014-02-24',2,3)
Insert Into @table1(date,month,DayOfWeek) values('2014-02-14',2,4)
Insert Into @table1(date,month,DayOfWeek) values('2014-02-15',2,1)
Insert Into @table1(date,month,DayOfWeek) values('2014-02-16',2,2)
Insert Into @table1(date,month,DayOfWeek) values('2014-02-17',2,3)
Insert Into @table1(date,month,DayOfWeek) values('2014-02-18',2,4)

END

Select Date,Month from (
Select *,row_number() over (partition by DayOfWeek,month order by Date) as seqnum from @table1) t2
where seqnum =3 and Dayofweek=3

Выход

Date    Month
2014-01-13  1
2014-02-17  2
0 голосов
/ 29 марта 2019

Следующий скрипт даст вам все третьи воскресенья за указанный период:

USE TEMPDB

DECLARE @StartDate DATE
DECLARE @EndDate DATE

SET @StartDate = '2000-01-01'  
SET @EndDate  = '2040-12-31'  

IF OBJECT_ID ('TEMPDB..#Date') IS NOT NULL DROP TABLE #Date
IF OBJECT_ID ('TEMPDB..#Date') IS NULL CREATE TABLE #Date (Date DATE)

INSERT INTO #Date VALUES (@StartDate)

WHILE @StartDate < @EndDate

BEGIN
INSERT INTO #Date

SELECT DATEADD (DD, 1, @StartDate) AS Date

SET @StartDate = DATEADD (DD, 1, @StartDate)

END;

WITH CTE AS 
(
    SELECT *,  
          CASE WHEN DATEPART (DW, Date) = 7 THEN 'Sunday' ELSE NULL END AS DayOfTheWeek
    FROM #Date AS D
)
, CTE2 AS 
(
    SELECT *,
         ROW_NUMBER() OVER (PARTITION BY YEAR (Date) * 100 + MONTH (Date) ORDER BY Date) AS RowNumb
    FROM CTE 
    WHERE DayOfTheWeek = 'Sunday'
)

SELECT * FROM CTE2 WHERE RowNumb = 3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...