2013-09-13 2 views
2

Я занимался вопросами, и мой текущий сценарий - найти ближайшую субботу для данной даты. После того, как я получил логику, я придумал, что выглядит длинным и грязным запросом. И мне было интересно, есть ли способ упростить это. Вот мой запросКак найти Ближайший (день недели) на заданную дату

DECLARE @DATE DATE 
SET @DATE ='2013-09-13' 

IF    DATENAME(DW,@DATE) = 'SUNDAY' 
    BEGIN 
     SELECT DATEADD(DAY,-1,@DATE) AS DATE, 'IS THE NEAREST SATURDAY' 
    END 
ELSE IF   DATENAME(DW,@DATE) = 'MONDAY' 
    BEGIN 
     SELECT DATEADD(DAY,-2,@DATE) AS DATE, 'IS THE NEAREST SATURDAY' 
    END 
ELSE IF   DATENAME(DW,@DATE) = 'TUESDAY' 
    BEGIN 
     SELECT DATEADD(DAY,-3,@DATE) AS DATE, 'IS THE NEAREST SATURDAY' 
    END 
ELSE IF   DATENAME(DW,@DATE) = 'WEDNESDAY' 
    BEGIN 
     SELECT DATEADD(DAY,3,@DATE) AS DATE, 'IS THE NEAREST SATURDAY' 
    END 
ELSE IF   DATENAME(DW,@DATE) = 'THURSDAY' 
    BEGIN 
     SELECT DATEADD(DAY,2,@DATE) AS DATE, 'IS THE NEAREST SATURDAY' 
    END 
ELSE IF   DATENAME(DW,@DATE) = 'FRIDAY' 
    BEGIN 
     SELECT DATEADD(DAY,1,@DATE) AS DATE, 'IS THE NEAREST SATURDAY' 
    END 
ELSE IF   DATENAME(DW,@DATE) = 'SATURDAY' 
    BEGIN 
     SELECT CONVERT(NVARCHAR,@DATE) + ' IS SATURDAY' AS DATE_DOW 
    END 

Как мы видим запрос длинный и запускает несколько МСФ искать истинное состояние. Пожалуйста, не пишите запрос, просто намеки. Я хотел бы сам поработать над запросом.

ответ

1

Вот мой намек без ответа, как вы просили:

Рассмотрим манипуляцию дату, используя текущую дату (вы можете использовать GETDATE() или переменная дата), DATEADD() и DATEDIFF() могут быть использованы, чтобы написать это в пару строк.

Если вы просто хотите, чтобы упростить метод можно использовать CASE заявление:

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 

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

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

Спасибо Goat CO, у моего исходного запроса были операторы CASE. Но поскольку THEN [может иметь только результат], а не выражение, он не работает, поэтому я попытался настроить несколько переменных для каждого условия WHEN, которое, казалось, сработало. – TanmoyDB

+0

Почему бы не «ДЕЛО» работать? См. Обновленный. –

+0

Спасибо за обновление, CAST никогда не приходило в голову. Виноват. – TanmoyDB

0

Попробуйте это:

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

datePart (dw, ...) возвращает день недели для текущей даты.

7 - это число, возвращает количество дней до субботы

Добавить результат к дате, чтобы получить следующую субботу ...

Аналогичной логика, если вам нужно, чтобы вернуться к предыдущей субботе

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

+0

Благодарим вас за запрос и объяснение. – TanmoyDB

+0

Это не работает так, как написано, но оно близко. –

+0

Goat CO - работает отлично, как написано на SQL 2008 Просто хотел дать op другой способ решить этот вопрос – Sparky

0

Ну не совсем ответ, но альтернатива

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 
Смежные вопросы