如何根据月份/日期执行脚本?

时间:2012-05-01 23:02:37

标签: sql tsql datediff getdate

好吧,我觉得我应该能够做到这一点,但我搜索无济于事。

我需要根据一年中的哪一天显示两种不同的数据集中的一种。具体来说,如果今天是10月31日(或更早),我想把所有参赛作品从去年10月1日拉到当年年底。如果今天是在10月31日之后,我希望我的数据集显示从当年10月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)

问题的简化形式可能是我如何才能运行某些代码,只有今天是<= 10月31日。如果我能说&lt; = 2012年10月31日,那将是非常容易的,但我需要它动态,以便它每年翻转。

2 个答案:

答案 0 :(得分:1)

查询过滤当前年份的记录,然后使用CASE表达式指定 1 的值,如果出发日期属于 11月 12月所有其他月份 0 。使用相同的逻辑来指定今天的日期。然后比较两个CASE表达式值以获取匹配的记录。

如果您想切换到其他月份,例如从 31,10月 31,March ,那么CASE中的值 10 表达式必须更改为 03

Click here to view the demo in SQL Fiddle.

脚本

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

答案 1 :(得分:1)

以下小技巧将允许您根据月份选择不同的子集:

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

最后一个参数构成当年10月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
相关问题