2016-04-07 22 views
0

Bütün ay veya salı günleri önceki ayın sonuna kadar nasıl alabilirim? Bunun hakkında bir örnek görmedim.Pazartesi veya Salı günleri arasındaki tüm aylar önceki aylar nasıl olur?

+0

http: //bradsruminations.blogspot.ru/search? Updated-max = 2011-10-04T12: 57: 00-07: 00 & max-results = 1 ''Adım Adım Netlik 'konu – DimaSUN

+0

Sorunuz referans tarihi olduğunu varsayar. Çünkü artık dünyanın farklı yerlerinde farklı tarihler var, "önceki ay" farklı insanlardan farklı olabilir. 'GETDATE()', sunucunun saat dilimini kullanır. Bu bugün alakalı mı? Ya yarın değişirse? –

cevap

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

Çözüm için teşekkür ederiz. bu temiz. – angelcake

2

Sen kullanabilirsiniz:

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

Çıktı:

╔════════════╗ 
║ 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 ║ 
╚════════════╝ 

Uyarı:

SQL Server dili,olmalıdır, DATENAME othewise eşleşmeyecektir.

DATEPARTweekday ile de karşılaştırabilirsiniz, ancak SET DATEFIRST ayarını bilmeniz gerekir.


DÜZENLEME:

biraz daha kısa:

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

Bu şekilde çalışması için çok akıllı. Çok teşekkür ederim! – 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') 
Bazı exaples (cte ile)