2013-10-08 3 views
8

Я пробовал решение для этого.Получить текущую неделю с понедельника по воскресенье

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

это дает с понедельника по субботу в результате, но в воскресенье он дает мне на следующей неделе дни

Я хочу, чтобы воскресенье, как последний день недели и в понедельник, как первый день недели ..

Пожалуйста Помощь ...

+0

Вы должны взглянуть на этот ответ [Получить первый день недели в SQL Server] (HTTP://stackoverflow.com/a/7169656/1297603) – Yaroslav

ответ

9

В общем, используйте SET DATEFIRST 1, чтобы указать, что понедельник - первый день недели. Однако это не решает проблему здесь. Используйте этот синтаксис вместо:

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

большое спасибо, я получил необходимое решение. – saylesh

+0

Идеальный ответ. Спасибо –

1

Вы просто добавить 6 дней вместо 5.

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

Ошибка: неверная синтаксическая ошибка –

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

Это может быть чрезмерно сложно, но это было весело.

- Это первая часть, чтобы получить самую последнюю произошедшую в понедельник.

- Он начинается с создания таблицы, которая будет содержать все даты до самого последнего понедельника, а затем устанавливает min этой таблицы переменной @mondaythisweek.

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 часть создает таблицу из @mondaythisweek к следующему воскресенью

;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) 
Смежные вопросы