2016-04-07 10 views
0

月曜日または火曜日の前月の取得方法を教えてください。私はそれについての例を見ていない。前月のすべての月曜日または火曜日の取得方法

+0

いくつかのexaples(cte) 'http://bradsruminations.blogspot.ru/search?updated-max = 2011-10-04T12:57:00-07:00&max-results = 1''ステップバイステップの明瞭さ'トピック – DimaSUN

+0

あなたの質問は参照日付を前提としています。今は世界の異なる場所で異なる日付を持つため、「前月」は異なる人々と異なる可能性があります。 'GETDATE()'はサーバのタイムゾーンを使います。これは今日の意味ですか?もし明日が変わるとどうなるでしょうか? –

答えて

1
;WITH CTE (X) 
AS 
(
SELECT DATEADD(MM,DATEDIFF(MM,0,GETDATE())-1,0) 
), 
CTE2(N) AS 
(
SELECT 0 
UNION ALL 
SELECT 1+N FROM CTE2 WHERE N< (SELECT DATEDIFF(DD,DATEADD(MM,DATEDIFF(MM,0,GETDATE())-1,0),DATEADD(MM,1,DATEADD(MM,DATEDIFF(MM,0,GETDATE())-1,0))-1)) 
) 
SELECT DATEADD(DD,N,X),DATENAME(DW,DATEADD(DD,N,X)) FROM CTE,CTE2 WHERE DATENAME(DW,DATEADD(DD,N,X)) IN ('Monday','Tuesday') 
+0

ありがとうございます。それはきちんとしている。 – angelcake

2

あなたは使用することができます

DECLARE @d DATE = GETDATE(); 

SELECT sub.prev_date 
FROM (SELECT @d, MONTH(DATEADD(MM, -1, @d))) AS s(d,m) 
CROSS APPLY (
    SELECT DATEADD(D, c-1, DATEADD(MM, -1, DATEADD(DD, 1 - DAY(d),d))) AS prev_date 
    FROM (
    VALUES (1),(2),(3),(4),(5),(6),(7),(8),(9),(10), 
      (11),(12),(13),(14),(15),(16),(17),(18),(19),(20), 
      (21),(22),(23),(24),(25),(26),(27),(28),(29),(30),(31))AS x(c) 
    ) AS sub 
WHERE MONTH(sub.prev_date) = s.m 
    AND DATENAME(dw,sub.prev_date) IN ('Monday','Tuesday'); 

LiveDemo

出力:

╔════════════╗ 
║ prev_date ║ 
╠════════════╣ 
║ 2016-03-01 ║ 
║ 2016-03-07 ║ 
║ 2016-03-08 ║ 
║ 2016-03-14 ║ 
║ 2016-03-15 ║ 
║ 2016-03-21 ║ 
║ 2016-03-22 ║ 
║ 2016-03-28 ║ 
║ 2016-03-29 ║ 
╚════════════╝ 

警告:

SQL Serverの言語はEnglishで、DATENAMEと一致しません。

また、DATEPARTweekdayと比較することもできますが、SET DATEFIRSTの設定が必要です。


EDIT:

ビット短く:

DECLARE @d DATE = '2015-01-01'; 

SELECT sub.prev_date 
FROM (SELECT DATEADD(DD, c - DAY(@d),DATEADD(MM, -1, @d)) AS prev_date 
     FROM (VALUES (1),(2),(3),(4),(5),(6),(7),(8),(9),(10), 
       (11),(12),(13),(14),(15),(16),(17),(18),(19),(20), 
       (21),(22),(23),(24),(25),(26),(27),(28),(29),(30),(31))AS x(c)) AS sub 
WHERE MONTH(sub.prev_date) = MONTH(DATEADD(MM, -1, @d)) 
    AND DATENAME(dw,sub.prev_date) IN ('Monday','Tuesday'); 

LiveDemo

+1

これは、この方法で動作させるのが非常にスマートです。どうもありがとうございます! – angelcake

2
declare @table table 
(
    ID integer identity, 
    DateRange date, 
    Remark nvarchar(10), 
    MonWeek nvarchar(1), 
    weekgrp integer 
) 

declare @from Date 
declare @newfrom Date 
declare @to Date 
declare @min integer 
declare @max integer 

set @from ='2016-03-01' 
set @to = '2016-03-31' 
set @newfrom = '2016-03-01' 

while @from <= @to 
begin 
    insert into @table (DateRange, Remark) Values (@from,DATENAME(dw,@from)) 

    set @from = DATEADD(dd,1,@from) 
end 

update @table 
set MonWeek = 'Y' 
where Remark = 'Monday' 

select @min = MIN(ID), @max = MAX(ID) from @table 
where MonWeek = 'Y' 

--to calculate week group 
while @min <= @max 
begin 
    Update @table 
    set weekgrp = @min 
    where ID between @min and @min + 7 
    set @min = @min + 7 
end 

select * from @table 
where Remark in ('Monday','Tuesday') 
関連する問題