2

指定された (1/2/3/4/5) 週から開始日と終了日を見つける必要があります。Date_Created が指定された (1/2/3/4/5) 週になるレコードを取得できるようにします。

たとえば、

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 があります。誰かがアイデアを持っている場合は、共有してください。

4

4 に答える 4

3

これは、特定の月のすべての週の開始日と終了日を取得するクエリです。したがって、このクエリの週から必要なものを選択できます。

SQLFiddle の例

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
于 2013-02-20T11:57:07.963 に答える
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
于 2013-02-20T13:32:41.553 に答える
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 WeekOfMonth=@Week 

RETURN
于 2013-02-21T06:51:50.047 に答える
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

ここを参照してください:

フィドル

于 2013-02-20T10:42:25.397 に答える