2012-05-01 2 views
0

Хорошо, я чувствую, что должен это сделать, но я искал безрезультатно.Как выполнить скрипты в зависимости от того, какой месяц/день он?

Мне нужно показать один из двух разных наборов данных в зависимости от того, в какой день года он есть. В частности, если сегодня 31 октября (или ранее), я хочу вытащить все записи с 1 октября прошлого года до конца текущего года. Если сегодня после 31 октября, я хочу, чтобы в моем наборе данных показывались записи с 1 октября текущего года до конца следующего года.

В приведенном ниже коде создается простая переменная таблицы «Календарь», которая хранит все месяцы, существующие в определенном наборе данных. Сейчас я просто ограничиваю его датами в текущем году. Я хотел бы заменить это кодом, чтобы он функционировал, как я уже говорил выше. Я думал об использовании оператора IF, но я не могу понять, как сравнить его с днем ​​и месяцем getdate().

DECLARE @calendar TABLE 
(  mon_name VARCHAR(10) 
    , mon_number INT 
    , yr   INT 
) 

INSERT INTO @calendar 
SELECT  DATENAME(m,departure_date) 
     , MONTH(departure_date) 
     , YEAR(departure_date) 
FROM  trip_mission 
WHERE  departure_date   <>'1/1/1900' 
AND   YEAR(departure_date) = YEAR(getdate()) 
GROUP BY DATENAME(m,departure_date) 
     , MONTH(departure_date) 
     , YEAR(departure_date) 

Упрощенная форма вопроса может быть, как я могу запустить код только если сегодня < = 31 октября было бы просто супер, если бы я мог сказать < = 31 октября 2012, но мне это нужно чтобы быть динамичным, чтобы он перелистал каждый год.

+1

Октябрь 2-31 отвечает указанным требованиям. Думаю, вам нужно изменить свой вопрос. Вы имели в виду «Если сегодня после 1 ноября»? – RThomas

+0

Упс, спасибо, что поймал опечатку. Отредактированный пост. 31 октября - дата «переключения» данных. Фактические наборы данных накладываются на некоторые намеренно, но только один из них должен использоваться в зависимости от того, с какой стороны 31 октября сегодня. Имеют смысл? Трудно объяснить, когда я показываю только 1 набор данных. – gmaness

+0

RThomas - На второй взгляд я понял, о чем вы говорили.Я обновил сообщение, чтобы теоретизировать тот же диапазон дат для набора данных. Мне нужно, чтобы он перешел на следующий «вид» каждый 31 октября. – gmaness

ответ

1

Следующая маленькая хитрость позволит вам выбрать различные подмножества на основе, в каком месяце это:

WHERE departure_date >= DATEADD(
    YEAR, 
    MONTH(GETDATE())/11 - 1, 
    CAST(YEAR(GETDATE()) AS char(4)) + '1001' 
) 

Последний аргумент составляет дату 1 октября текущего года. Второй аргумент определяет, вычитаем ли мы 1 год или нет. Предполагая, что текущий год составит 2012 год, мы получаем то, что получаем в зависимости от текущего месяца

Current month MONTH(GETDATE()) MONTH(…)/11 MONTH(…)/11 - 1 DATEADD(…) 
------------- ---------------- ------------- ----------------- ---------- 
January  1     0    -1     2011-10-01 
February  2     0    -1     2011-10-01 
March   3     0    -1     2011-10-01 
April   4     0    -1     2011-10-01 
May   5     0    -1     2011-10-01 
June   6     0    -1     2011-10-01 
July   7     0    -1     2011-10-01 
August   8     0    -1     2011-10-01 
September  9     0    -1     2011-10-01 
October  10    0    -1     2011-10-01 
November  11    1    0     2012-10-01 
December  12    1    0     2012-10-01 
+0

Хороший! Я думал о чем-то подобном. Но мне нужна дополнительная переменная :) – Leigh

+0

Andriy, красиво сделано! Мне все равно придется «массажировать» это совсем немного, чтобы соответствовать моему общему приложению, но я пошел дальше и отметил это как ответ, поскольку я думаю, что это путь, которому я должен следовать. Благодаря! – gmaness

1

Запрос фильтрует только записи текущего года, а затем использует выражение CASE, чтобы присвоить значение из если дата вылета попадает в ноября и декабря и для всех остальных месяцев. Та же логика используется для назначения для сегодняшней даты. Оба значения выражения CASE затем сравниваются с выбором совпадающих записей.

Если вы хотите переключиться на другой месяц, скажем, от 31 октября к 31 марта, то значение в выражении CASE, должно быть изменено на .

Click here to view the demo in SQL Fiddle.

Script:

CREATE TABLE trip_mission 
(
    departure_date DATETIME NOT NULL 
); 

INSERT INTO trip_mission (departure_date) VALUES 
    ('2012-04-30'), 
    ('2011-01-01'), 
    ('2012-01-30'), 
    ('2012-04-30'), 
    ('2013-01-01'), 
    ('2012-11-01'), 
    ('2012-12-01'), 
    ('2012-11-12'), 
    ('1900-01-01'), 
    ('2012-10-31'); 

SELECT departure_date 
FROM trip_mission tm 
WHERE YEAR(departure_date) = YEAR(GETDATE()) 
AND  (CASE WHEN MONTH(departure_date) > 10 THEN 1 ELSE 0 END) = 
     (CASE WHEN MONTH(GETDATE())  > 10 THEN 1 ELSE 0 END) 

Выход:

DEPARTURE_DATE 
----------------------- 
2012-04-30 00:00:00.000 
2012-01-30 00:00:00.000 
2012-04-30 00:00:00.000 
2012-10-31 00:00:00.000