Как получить последнее воскресенье года с помощью TSQL? - PullRequest
0 голосов
/ 10 мая 2018

Мне нужно проверить, является ли данный день последним воскресеньем в каком-либо году, если да, то возвращение 1 с использованием только TSQL.

У меня нет большого представления о TSQL, так что, кто-нибудь поможет, ребята?

Ответы [ 6 ]

0 голосов
/ 11 мая 2018

Вы также можете использовать это, чтобы получить каждый последний день года:

;WITH getlastdaysofyear ( LastDay, DayCnt ) AS ( 
   SELECT   DATEADD(dd, -DAY(DATEADD(mm, 1,  DATEADD(yy, DATEDIFF(yy, 0, GETDATE()) + 1, -1))),
            DATEADD(mm, 1,  DATEADD(yy, DATEDIFF(yy, 0, GETDATE()) + 1, -1))),
            0 AS DayCnt
   UNION ALL
   SELECT   LastDay,
   DayCnt + 1
   FROM     getlastdaysofyear
)
   SELECT  *
        FROM ( SELECT TOP 7 DATEADD(DD, -DayCnt, LastDay) LastDate,
                      'Last ' + DATENAME(Weekday,DATEADD(DD, -DayCnt, LastDay)) AS DayStatus
   FROM      getlastdaysofyear ) T

ORDER BY DATEPART(Weekday, LastDate)

Надеюсь, вам понравится:)

0 голосов
/ 10 мая 2018

Это становится довольно тривиальным, если у вас есть Таблица календаря

DECLARE @CheckDate DATE = '20181230'

;WITH cteGetDates AS 
(
    SELECT
         [Date], WeekDayName, WeekOfMonth, [MonthName], [Year]
        ,LastDOWInMonth = ROW_NUMBER() OVER 
        (
            PARTITION BY FirstDayOfMonth, [Weekday] 
            ORDER BY [Date] DESC
        )
    FROM
        dbo.DateDimension
)
SELECT * FROM cteGetDates D
WHERE D.LastDOWInMonth = 1 AND D.WeekDayName = 'Sunday' and D.MonthName = 'December' AND D.[Date] = @CheckDate
0 голосов
/ 10 мая 2018

Вы можете использовать эту функцию

Код функции:

    create FUNCTION CheckIsSaturday 
(
    @date DATETIME
)
RETURNS int
AS
BEGIN
    -- Declare the return variable here
    DECLARE @result INT
    DECLARE @DayOfWeek NVARCHAR(22)
    DECLARE @LastDayOfYear DATETIME
    select @LastDayOfYear=DATEADD(yy, DATEDIFF(yy, 0, @date) + 1, -1)
    SELECT @DayOfWeek=DATENAME(dw, @date)
    IF(@DayOfWeek='Saturday' AND DATEDIFF(dd,@date,@LastDayOfYear)<7)
        RETURN 1;
    RETURN 0; 

END
GO

Функция Использование:

SELECT dbo.CheckIsSaturday('2017-12-23')
0 голосов
/ 10 мая 2018

Используя запрос мистера Гордона, следующий IIF () возвращает 1, если данный день является последним воскресением года, возвращает 0, если это не так.

Использование 2018 в качестве года и 2018-12-30 в качестве данной даты . Вы можете заменить значения переменными.

select IIF( DATEDIFF(DAY,'2018-12-30',
              DATEADD(day,
              1 - datepart(weekday, datefromparts(2018, 12, 31)),
              datefromparts(2018, 12, 31)
                   )) = 0, 1, 0)
0 голосов
/ 10 мая 2018

Я не работал с tsql специально, но если мои знания sql и поиск в Google достаточно хороши, то что-то вроде этого должно сработать:

... WHERE DATEPART(dw, date) = 7 and DATEDIFF (d, date, DATEFROMPARTS (DATEPART(yyyy, date), 12, 31)) <= 6

В основном мы проверяем, является ли этот день сначала воскресеньем, а затем, если он меньше недели до последнего дня года

0 голосов
/ 10 мая 2018

SQL Server имеет проблему с рабочими днями, поскольку они могут зависеть от настроек интернационализации.Принимая значения по умолчанию, вы можете сделать:

select dateadd(day,
               1 - datepart(weekday, datefromparts(@year, 12, 31)),
               datefromparts(@year, 12, 31)
              )

В противном случае вам нужно будет сделать выражение case, чтобы превратить день недели в число.

В старшем возрастеверсию SQL Server вы можете сделать:

select dateadd(day,
               1 - datepart(weekday, cast(@year + '0101' as date)),
               cast(@year + '0101' as date)
              )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...