好吧,我觉得我应该能够做到这一点,但我搜索无济于事。
我需要根据一年中的哪一天显示两种不同的数据集中的一种。具体来说,如果今天是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日,那将是非常容易的,但我需要它动态,以便它每年翻转。
答案 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