2012-04-04 21 views

答えて

5

以下は、あなたがの最初の日を考えるものは何でも動作します:あなたは、週の最初と最後の日を事前に移入ができ、その後、あなたのクエリは、このようなものになる可能性がカレンダーテーブルで

週(日曜日、月曜日など)、デフォルトから変更したい場合は SET DATEFIRSTを必ず使用してください。 SET DATEFIRST 1は、週の最初の曜日を月曜日にします。

SELECT DATEADD(DAY, 1 - DATEPART(WEEKDAY, GETDATE()), CAST(GETDATE() AS DATE)) [WeekStart], 
     DATEADD(DAY, 7 - DATEPART(WEEKDAY, GETDATE()), CAST(GETDATE() AS DATE)) [WeekEnd] 

EDIT

私はちょうどあなたが要求し再読み込みしていると私はあなたが私が上記したものと別の何かの後かもしれないと思います。私与えられた

週、月、四半期、半年、一年の開始日と終了日。ここ

SELECT DATENAME(WEEKDAY, DATEADD(DAY, 1 - DATEPART(DAY, GETDATE()), GETDATE())) [FirstDayOfMonth], 
     DATENAME(WEEKDAY, DATEADD(DAY, - DATEPART(DAY, DATEADD(MONTH, 1, GETDATE())), DATEADD(MONTH, 1, GETDATE()))) [LastDayOfMonth] 
+0

ありがとう、Mr.Gareth D、私はそれを得ました、私はあなたのクエリを使用し、今、それはあなたに感謝しているいくつかのコードを追加します。 –

6

週間の使用の最初の日を取得するには:

select dateadd(wk, datediff(wk, 0, getdate()), 0) 

最終日は初日+ 6になります。

select dateadd(wk, datediff(wk, 0, getdate()), 0) + 6 

は警告:これは文化に敏感です。 @@datefirst

1

あなたの要件は不明です:あなたは週の最初と最後の日であると考えていますか?日曜日と土曜日?月曜日と金曜日?月曜日と日曜日?しかし、多くの日付関連のクエリの最適な解決策は、calendar tableを作成することです。これにより、あなたの定義に従って、必要に応じて複数のフォーマットでも、週、月、年の最初と最後の日を簡単に設定することができます。

これは、国や会社によって定義が異なる財務年度、営業日などのコンセプトで作業する場合に特に便利です。ロジックに対する例外が存在する場合、これは最も簡単なソリューションです。年の最初の週は「通常の」週とは異なる規則を持っています。

-- first/last days stored as dates in their own columns 
select FirstDayOfThisWeek, LastDayOfThisWeek 
from dbo.Calendar 
where BaseDate = @SomeDate 

-- first/last days stored as bit flags 
select max(BaseDate) 
from dbo.Calendar 
where BaseDate <= @SomeDate and IsFirstDayOfWeek = 0x1 
0

:あなたは月の最初と最後の曜日をしたい場合、これはトリックを行います。

 Select CONVERT(varchar(50), GETDATE(),105) 'GETDATE' , 
     CONVERT(varchar(50), DATEADD(DAY, 2 - DATEPART(WEEKDAY, GETDATE()), CAST(GETDATE() AS DATE)),105) [WeekStart], 
CONVERT(varchar(50),DATEADD(DAY, 8 - DATEPART(WEEKDAY, GETDATE()), CAST(GETDATE() AS DATE)) ,105)[WeekEnd], 
CONVERT(varchar(50),DATEADD(dd, -DAY(getdate()) + 1, getdate()),105) MonthStart, 
CONVERT(varchar(50),DATEADD(dd, -DAY(DATEADD(mm, 1, getdate())), DATEADD(mm, 1, getdate())),105) MonthStart, 
CONVERT(varchar(50), DATEADD(q, DATEDIFF(q, 0, GETDATE()), 0),105) AS 'QStart Date',  
CONVERT(varchar(50), DATEADD(d, -1, DATEADD(q, DATEDIFF(q, 0, GETDATE()) + 1,0)),105) AS 'QEnd Date', 
CONVERT(varchar(50), CAST(CAST(((((MONTH(GETDATE()) - 1)/6) * 6) + 1) AS VARCHAR) + '-1-' + CAST(YEAR(GETDATE()) AS VARCHAR) AS DATETIME),105) StartOfHalfYear, 
CONVERT(varchar(50), CAST(CAST(((((MONTH(GETDATE()) - 1)/6) * 6) + 6) AS VARCHAR) + '-1-' + CAST(YEAR(GETDATE()) AS VARCHAR) AS DATETIME),105)EndOfHalfYear, 
CONVERT(varchar(50), DATEADD(yy, DATEDIFF(yy,0,getdate()), 0),105) AS StartOfYear, 
CONVERT(varchar(50), DATEADD(yy, DATEDIFF(yy,0,getdate()) + 1, -1),105) AS EndOfYear 
1

以下は、日付の値としてWeekbeginを作成するためのケースステートメントです。 @pDateとして設定した曜日に応じて、月曜日、火曜日、水曜日などに週が始まります。

あなたは常に、ちょうど(D、6をDATEADD使用することにより、CASEの週の最終日を取得することができ、あなたの選択

CASE 
    WHEN DATEPART(dw, CAST(DATEVALUE AS DATE)) BETWEEN @pDatePart AND 7 THEN DATEADD(d, (DATEPART(dw, CAST(DATEVALUE AS DATE))*-1)[email protected], CAST(DATEVALUE AS DATE)) 
    WHEN DATEPART(dw, CAST(DATEVALUE AS DATE)) BETWEEN 1 AND @pDatePart-1 THEN DATEADD(d, (DATEPART(dw, CAST(DATEVALUE AS DATE))*-1)+(@pDatePart-7), CAST(DATEVALUE AS DATE)) 
    END 
    AS DynamicWeekBegin 

た後に、このcase文を入れて次にパラメータ

DECLARE @pDate Date = NULL --Replace with your date, which will also be the first day of the week 
DECLARE @pDatePart SMALLINT = DATEPART(dw, @pDate) 

を作成します。ステートメント)

関連する問題