2013-10-08 12 views
8

Próbowałem rozwiązania tego problemu.Otrzymuj bieżące dni tygodnia od poniedziałku do niedzieli

select dateadd(wk, datediff(wk, 0, getdate()), 0)as StartDate , 
    (select dateadd(wk, datediff(wk, 0, getdate()), 0) + 5) as EndDate 

daje poniedziałku do soboty w wyniku, ale w niedzielę to daje mi kolejny tydzień dzień

Chcę niedzielę ostatniego dnia tygodnia i poniedziałek jako pierwszy dzień tygodnia ..

proszę Pomoc ...

+0

Trzeba przyjrzeć się tej odpowiedzi [Get pierwszy dzień tygodnia w SQL Server] (http://stackoverflow.com/a/7169656/1297603) – Yaroslav

Odpowiedz

9

Ogólnie, należy użyć SET DATEFIRST 1, aby określić, że poniedziałek jest pierwszym dniem tygodnia. Jednak to nie rozwiązuje problemu tutaj. Użyj tej składni zamiast:

SELECT DATEADD(week, DATEDIFF(day, 0, getdate())/7, 0) AS StartWeek, 
     DATEADD(week, DATEDIFF(day, 0, getdate())/7, 5) AS EndWeek 

Demo

SET DATEFIRST (Transact-SQL)

1 Monday 
2 Tuesday 
3 Wednesday 
4 Thursday 
5 Friday 
6 Saturday 
7 (default, U.S. English) Sunday 
+0

wielkie dzięki, mam wymagane rozwiązanie z tego. – saylesh

+0

Doskonała odpowiedź. Dzięki –

1

Wystarczy dodać 6 dni zamiast 5.

select dateadd(wk, datediff(wk, 0, getdate()), 0) as StartDate 
select dateadd(wk, datediff(wk, 0, getdate()), 0) + 6) as EndDate 
+0

Błąd: Nieprawidłowy błąd składni –

0
DECLARE 
    @d datetime, 
    @f datetime; 

SET @d = dateadd(week,datediff(week,0,getdate())-48,0) --start of week from a year ago 
SET @f = dateadd(week,datediff(week,0,getdate()),0) --start of current partial week; 

create table #weeks (
    week_starting datetime primary key 
) 

while @d < @f 
begin 
    insert into #weeks (week_starting) values (@d) 
    set @d = dateadd(week,1,@d) 
end 
select * from #weeks 

drop table #weeks 
0

To może być zbyt skomplikowane, ale było mnóstwo zabawy.

- Ta pierwsza część dotyczy ostatniego poniedziałku.

--Zaczyna się od utworzenia tabeli, która będzie zawierała wszystkie daty do ostatniego poniedziałku, a następnie ustawia min tej tabeli na zmienną @moonaythisweek.

declare @dateholder table (
    thedate date, 
    theday varchar(10) 
    ) 

declare @now datetime 
set @now = GETDATE() 

;with mycte as (
    select 
     cast(@now as date) as "thedate", 
     DATENAME(dw,@now) as "theday" 
    union all 
    select 
     cast(DATEADD(d,-1,"thedate") as date) as "thedate", 
     DATENAME(DW,DATEADD(d,-1,"thedate")) as "theday" 
    from 
     mycte 
    where 
     "theday" <> 'Monday' 
    ) 
insert into @dateholder 
select * from mycte 
option (maxrecursion 10) 

declare @mondaythisweek date 
set @mondaythisweek = (
select min(thedate) 
from @dateholder 
) 

--This część tworzy tabelę z @mondaythisweek do następnej niedzieli

;with mon_to_sun as (
    select 
     @mondaythisweek as "dates", 
     DATENAME(dw,@mondaythisweek) as "theday" 
    union all 
    select 
     cast(DATEADD(d,1,"dates") as date) as "dates", 
     DATENAME(dw,cast(DATEADD(d,1,"dates") as date)) as "theday" 
    from mon_to_sun 
    where "theday" <> 'Sunday' 
) 
select * 
from mon_to_sun 
option(maxrecursion 10)