INSERT INTO @blah (ID, Date)
VALUES (123, '11/12/2012')
VALUES (124, '11/30/2012')
VALUES (125, '11/28/2012')
VALUES (126, '12/1/2012')
VALUES (127, '12/30/2012')
VALUES (128, '12/25/2012')
VALUES (129, '12/26/2012')
我希望获得行,其中日期是相应月份的最后一周,可以追溯到两个月。这个月是2013年1月,所以我想要2012年12月和2012年11月的最后一周。
最终的选择是一个月的最后一周例子:2012年12月= 12 / 23-12 / 29但是现在生病是在这个月的最后7天。
我知道如何获得最近两个月但不确定如何获得相应月份的最后一周..
select
*
from
@blah
where
dateDiff(month,date,getdate()) < 2 ---only look at the last two months
答案 0 :(得分:5)
这符合规定的要求(前两个月的最后一周):
SET DATEFIRST 1;
DECLARE @s DATE = GETDATE(), @s1 DATE, @s2 DATE;
SET @s = GETDATE();
-- last day of last month:
SET @s1 = DATEADD(DAY, -DAY(@s), @s);
-- last day of previous month:
SET @s = DATEADD(MONTH, -1, @s);
SET @s2 = DATEADD(DAY, -DAY(@s), @s);
SELECT
@s1 = DATEADD(DAY, -7, DATEADD(DAY, -DATEPART(WEEKDAY, @s1) % 7, @s1)),
@s2 = DATEADD(DAY, -7, DATEADD(DAY, -DATEPART(WEEKDAY, @s2) % 7, @s2));
SELECT col1, col2, etc.
FROM dbo.table
WHERE
(date_column >= @s1 AND date_column < DATEADD(DAY, 7, @s1)
OR
(date_column >= @s2 AND date_column < DATEADD(DAY, 7, @s2);
为了使这更具活力(你应该尽力说明这些要求,而不是在人们投入大量工作之后),你可以说:
DECLARE @NumberOfMonthsIReallyWanted INT = 3;
DECLARE @i INT = 1, @d DATE = GETDATE();
DECLARE @t TABLE(d DATE);
WHILE @i <= @NumberOfMonthsIReallyWanted
BEGIN
SET @d = DATEADD(MONTH, -@i, @d)
INSERT @t(s) SELECT DATEADD(DAY, -7, DATEADD(DAY,
-DATEPART(WEEKDAY, DATEADD(DAY, -DAY(@d), @d)) % 7,
DATEADD(DAY, -DAY(@d), @d)));
SET @i += 1;
END
SELECT src.col1, src.col2, etc.
FROM dbo.table AS src
INNER JOIN @t AS t
ON src.date_column >= t.d AND src.date_column < DATEADD(DAY, 7, t.d);
请不要让任何人说服您使用LIKE
进行日期比较查询。这不仅会破坏sargability(意味着不能使用索引),但是,对于这样的问题,您如何确定要匹配的字符串模式?困难不在于构建WHERE
子句,而在于填充魔术(Your Dates go here)
占位符的内容。当你找到日期范围时,你真的想要14个单独的LIKE
表达式吗?我不愿意。
答案 1 :(得分:0)
declare @blah table (ID int, [Date] datetime)
INSERT INTO @blah (ID, [Date])
select 123, '20121112'
union select 124, '20121130'
union select 125, '20121128'
union select 126, '20121201'
union select 127, '20121230'
union select 128, '20121225'
union select 129, '20121226'
select ID, [Date], datepart(week, [Date])
from @blah
where
datediff(month, [Date], getdate()) in (1,2)
and
datepart(week, [Date]) = datepart(
week,
dateadd(
day,
-datepart(day,dateadd(month, 1, [Date])),
dateadd(month, 1, [Date])))
答案 2 :(得分:0)
这适用于Oracle - 可能会给你一些想法并希望有所帮助:
-- Last weeks of last two months --
SELECT mydate
, TRUNC(mydate, 'iw') wk_starts
, TRUNC(mydate, 'iw') + 7 - 1/86400 wk_ends
, TO_NUMBER (TO_CHAR (mydate, 'IW')) ISO_wk#
FROM
( -- Last week = Last day of the year (hardcoded) - 1 week --
SELECT(CASE WHEN start_date = To_Date('12/31/2012', 'mm/dd/yyyy') THEN start_date-7 ELSE start_date END) mydate
FROM
( -- Last 2 months --
SELECT Add_Months(Last_Day(Trunc(SYSDATE)), - LEVEL) start_date
FROM dual
CONNECT BY LEVEL <= 2
)
)
/
答案 3 :(得分:-3)
这在某种程度上取决于您的SQL Server。此示例与Oracle类似。每个服务器都有自己的功能,如SYSDATE和NOW。
例如。
SELECT * from blah WHERE TO_CHAR(TRUNC(data), MM/DD/YYYY) < '01/14/2013'