2013-02-20 3 views
2

Мне нужно найти дату начала и дату окончания из указанной (1/2/3/4/5) недели месяца. Так что я могу получить записи, в которых Date_Created входит в указанную неделю (1/2/3/4/5).get startdate и enddate из указанной недели месяца

Например, если

I choose 1st week of febuary 2013 then 
I want startdate = 2/1/2013 and enddate = 2/2/2013 
I choose 2nd week of febuary 2013 then 
I want startdate = 2/3/2013 and enddate = 2/9/2013 

и точно также для отдыха недели.

У меня есть SQL Server 2008 со стороны базы данных. Если у кого-то есть идея, то пожалуйста, поделитесь.

ответ

3

Вот запрос, чтобы получить все недель даты начала и окончания для данный месяц. Так что вы можете выбрать из этого запроса недели вам необходимо:

SQLFiddle example

with C(i) as 
(select CAST('2013-02-01' as datetime) i 
    UNION ALL 
    select DATEADD (day,1,i) i from C 
    where DATEADD (day,1,i) 
      <DATEADD(month,1,'2013-02-01') 
), C1 as 
(
select DATEPART(WEEK,i)-DATEPART(WEEK,'2013-02-01')+1 WeekOfMonth,i from C 
) 
select WeekOfMonth,min(i) StartDate, max(i) EndDate from C1 group by WeekOfMonth 
+0

Thankx. Этот ответ помог мне. Его короткий код и после некоторой модификации в этом я создал процедуру, которая вводит неделю нет и выводит первый и последний день недели. – blue

+0

+1 Вау, это приятное решение, здесь очень разумно используются 'DATEPART (WEEK, i) -DATEPART (WEEK, '2013-02-01')' и 'GROUP BY' с' MIN' и 'MAX'. –

0

Вы можете попробовать это, чтобы получить начальную или конечную дату недели. Просто укажите дату, на которую вы найдете даты.

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

Скрипки немного, чтобы получить то, что вы хотите Вот код:

DECLARE @date datetime 
SET @date = '2013-01-30' 
DECLARE @startdate datetime 
DECLARE @enddate datetime 
DECLARE @MonthStart datetime 
Declare @MonthEnd datetime 

SET @startdate = DATEADD(wk, DATEDIFF(wk, 6, @date), 6) 
SET @enddate = DATEADD(dd,6, DATEADD(wk, DATEDIFF(wk, 6, @date), 6)) 
SET @monthStart = CONVERT(VARCHAR(25),DATEADD(dd,-(DAY(@date)-1),@date),101) 
SET @MonthEnd =CONVERT(VARCHAR(25),DATEADD(dd,-(DAY(DATEADD(mm,1,@date))),DATEADD(mm,1,@date)),101) 

--select @startdate wstart,@MonthStart monthstart,@enddate wend,@MonthEnd monthend 
select 
[date] = @date 
,[week] = DATEPART(wk,@date) 
,[WeekStartDate] = Case 
         WHEN @startdate <= @MonthStart then @MonthStart else @startdate 
        END 
,[WeekEndDate] = Case 
         WHEN @enddate > @MonthEnd then @MonthEnd else @enddate 
        END 

посмотреть здесь:

Fiddle

+0

thankx за ваш ответ, но я хочу, чтобы начальная дата и конец на входе в неделю не были датой. – blue

+0

как вы хотите войти в неделю? Это также можно сделать легко. Можете ли вы предоставить образец формата вашего входного значения. Как «1-2» для 1-й недели 2-го месяца? ... логика теперь дается просто для того, чтобы немного изменить код. –

+0

Вход будет 1 или 2 или 3 или 4 или 5. и вывод будет начальным и окончательным для соответствующей недели. это все рассмотрит текущий месяц. например, за 2 недели текущего месяца startdate будет 2/3/2013, а enddate будет 2/9/2013 – blue

1

я написал процедуру, чтобы решить мою проблему, которая займет неделю нет (1/2/3/4/5) в качестве входных данных и будет возвращать начальную дату и окончание

ALTER PROCEDURE dbo.SPGetStartAndEndDateofSpcifiedWeek 
    @Week int 
AS 
    SET NOCOUNT ON 
    DECLARE @date DateTime 
    DECLARE @currdate DateTime 
    DECLARE @startdate DateTime 
    DECLARE @enddate DateTime 
    DECLARE @CurrWeek int 

    /*SET @date = CONVERT(date,GETDATE())*/ 
    SET @currdate = CONVERT(date,GETDATE()) 
    SET @CurrWeek = datediff(week, dateadd(week, datediff(week, 0, dateadd(month, datediff(month, 0, GETDATE()), 0)), 0), GETDATE() - 1) + 1 

    IF (@Week = 1) 
    BEGIN 
     IF (@CurrWeek = 1) 
     BEGIN SET @date = @currdate END 
     IF (@CurrWeek = 2) 
     BEGIN SET @date = @currdate - 7 END 
     IF (@CurrWeek = 3) 
     BEGIN SET @date = @currdate - 14 END 
     IF (@CurrWeek = 4) 
     BEGIN SET @date = @currdate - 21 END 
     IF (@CurrWeek = 5) 
     BEGIN SET @date = @currdate - 28 END 
    END 
    IF (@Week = 2) 
    BEGIN 
     IF (@CurrWeek = 1) 
     BEGIN SET @date = @currdate + 7 END 
     IF (@CurrWeek = 2) 
     BEGIN SET @date = @currdate END 
     IF (@CurrWeek = 3) 
     BEGIN SET @date = @currdate - 7 END 
     IF (@CurrWeek = 4) 
     BEGIN SET @date = @currdate - 14 END 
     IF (@CurrWeek = 5) 
     BEGIN SET @date = @currdate - 21 END 
    END 
    IF (@Week = 3) 
    BEGIN 
     IF (@CurrWeek = 1) 
     BEGIN SET @date = @currdate + 14 END 
     IF (@CurrWeek = 2) 
     BEGIN SET @date = @currdate + 7 END 
     IF (@CurrWeek = 3) 
     BEGIN SET @date = @currdate END 
     IF (@CurrWeek = 4) 
     BEGIN SET @date = @currdate - 7 END 
     IF (@CurrWeek = 5) 
     BEGIN SET @date = @currdate - 14 END 
    END 
    IF (@Week = 4) 
    BEGIN 
     IF (@CurrWeek = 1) 
     BEGIN SET @date = @currdate + 21 END 
     IF (@CurrWeek = 2) 
     BEGIN SET @date = @currdate + 14 END 
     IF (@CurrWeek = 3) 
     BEGIN SET @date = @currdate + 7 END 
     IF (@CurrWeek = 4) 
     BEGIN SET @date = @currdate END 
     IF (@CurrWeek = 5) 
     BEGIN SET @date = @currdate - 7 END 
    END 
    IF (@Week = 5) 
    BEGIN 
     IF (@CurrWeek = 1) 
     BEGIN SET @date = @currdate + 28 END 
     IF (@CurrWeek = 2) 
     BEGIN SET @date = @currdate + 21 END 
     IF (@CurrWeek = 3) 
     BEGIN SET @date = @currdate + 14 END 
     IF (@CurrWeek = 4) 
     BEGIN SET @date = @currdate + 7 END 
     IF (@CurrWeek = 5) 
     BEGIN SET @date = @currdate END 
    END 

    Select CONVERT(date, DATEADD(wk, DATEDIFF(wk, 0, @date), - 1)) as startdate, 
       CONVERT(date, DATEADD(wk, DATEDIFF(wk, 0, @date), 5)) as enddate 

    RETURN 
1

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

CREATE PROCEDURE dbo.SPReturnStartEndDateOfSpecifiedWeek 
    @Week int, 
    @P_startdate DateTime OUTPUT, 
    @P_enddate DateTime OUTPUT 
AS 
    /* SET NOCOUNT ON */ 

    with C(i) as 
    ( 
     select CAST((DATEADD(mm, DATEDIFF(mm, 0, GETDATE()), 0)) as datetime) i 
     UNION ALL 
     select DATEADD (day,1,i) i from C 
     where DATEADD (day,1,i)<DATEADD(month,1,(DATEADD(mm, DATEDIFF(mm, 0, GETDATE()), 0))) 
    ), 
    C1 as 
    (
     select DATEPART(WEEK,i)-DATEPART(WEEK,(DATEADD(mm, DATEDIFF(mm, 0, GETDATE()), 0)))+1 WeekOfMonth,i from C 
    ), 
    C2 as 
    (
     select WeekOfMonth,min(i) StartDate, max(i) EndDate from C1 group by WeekOfMonth 
    ) 

    Select @P_startdate = StartDate, 
      @P_enddate = EndDate 
    from C2 
    WHERE [email protected] 

RETURN 
Смежные вопросы