How to find the Nearest (day of the week) for a given date

99封情书 提交于 2019-12-01 23:36:26

Here's my hint without answering, as you requested:

Consider date manipulation, using current date (you can use GETDATE() or your date variable), DATEADD() and DATEDIFF() can be used to write this in a couple lines.

If you just want to simplify your method you could use a CASE statement:

DECLARE @date DATE = '2013-09-13'
SELECT CASE WHEN DATENAME(DW,@DATE) = 'SUNDAY' THEN  CAST(DATEADD(DAY,-3,@DATE) AS VARCHAR(12)) + ' IS THE NEAREST SATURDAY'
            WHEN DATENAME(DW,@DATE) = 'MONDAY' THEN CAST(DATEADD(DAY,-2,@DATE) AS VARCHAR(12)) + ' IS THE NEAREST SATURDAY'
            WHEN DATENAME(DW,@DATE) = 'TUESDAY' THEN CAST(DATEADD(DAY,-1,@DATE) AS VARCHAR(12)) + ' IS THE NEAREST SATURDAY'
            WHEN DATENAME(DW,@DATE) = 'WEDNESDAY' THEN CAST(DATEADD(DAY,1,@DATE) AS VARCHAR(12)) + ' IS THE NEAREST SATURDAY'
            WHEN DATENAME(DW,@DATE) = 'THURSDAY' THEN CAST(DATEADD(DAY,2,@DATE) AS VARCHAR(12)) + ' IS THE NEAREST SATURDAY'
            WHEN DATENAME(DW,@DATE) = 'FRIDAY' THEN CAST(DATEADD(DAY,3,@DATE) AS VARCHAR(12)) + ' IS THE NEAREST SATURDAY'
            ELSE CONVERT(NVARCHAR,@DATE) + ' IS SATURDAY'
       END

To clarify on the method I was hinting at and Sparky posted, you need to adjust DATEFIRST to make this work, it works for whichever day is the first day of the week, Saturday is the 7th day of the week, so:

SET DATEFIRST 7
DECLARE @date DATE = '2013-09-21'
SELECT DATEADD(day,7-DATEPART(weekday,@date),@date)

Well not exactly an answer, but an alternative

    DECLARE @DATE DATE,
    @SUN DATE,
    @MON DATE,
    @TUE DATE,
    @WED DATE,
    @THU DATE,
    @FRI DATE,
    @SAT DATE

           SET @DATE = '2013-09-14'

    SET @SUN = DATEADD(DAY,-1,@DATE)
    SET @MON = DATEADD(DAY,-1,@DATE)
    SET @TUE = DATEADD(DAY,-2,@DATE)
    SET @WED = DATEADD(DAY,-3,@DATE)
    SET @THU = DATEADD(DAY,2,@DATE)
    SET @FRI = DATEADD(DAY,1,@DATE)
    SET @SAT = DATEADD(DAY,0,@DATE)

    SELECT CASE 
        WHEN DATENAME(DW,@DATE) = 'SUNDAY'
        THEN @SUN
        WHEN DATENAME(DW,@DATE) = 'MONDAY'
        THEN @MON
        WHEN DATENAME(DW,@DATE) = 'TUESDAY'
        THEN @TUE
        WHEN DATENAME(DW,@DATE) = 'WEDNESDAY'
        THEN @WED
        WHEN DATENAME(DW,@DATE) = 'THURSDAY'
        THEN @THU
        WHEN DATENAME(DW,@DATE) = 'FRIDAY'
        THEN @FRI
        ELSE @SAT
    END

Try this:

select dateAdd(dd,7-DATEPART(dw,getDate()),GETDATE())

datePart(dw,...) returns day of the week for current date.

7 - that number, returns number of days until Saturday

Add the result to the date to get the next Saturday...

Similar logic if you need to go back to previous Saturday

Sql Fiddle: http://www.sqlfiddle.com/#!3/61998/2

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!