0

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

我需要根据一年中的哪一天显示两个不同的数据集之一。具体来说,如果今天是 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 日时我才能运行一些代码。如果我可以说 <= 2012 年 10 月 31 日,那将非常容易,但我需要它是动态的,以便它会每年翻一次。

4

2 回答 2

1

该查询仅过滤当年的记录,然后如果出发日期在11 月12 月,则使用 CASE 表达式将值赋值为1 ,而对于所有其他月份,则赋值为0 。相同的逻辑用于分配今天的日期。然后比较两个 CASE 表达式值以获取匹配记录。

如果要切换到不同的月份,例如从10 月 31 日到3 月31 日,则 CASE 表达式中的值10必须更改为03

单击此处查看 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
于 2012-05-02T00:45:00.310 回答
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
于 2012-05-02T11:29:55.213 回答