SQLで、特定の月の開始日と終了日を取得する方法。手伝って頂けますか。
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]
編集
私はあなたの要求を読み直したところですが、あなたは私が上で与えたものとは異なる何かを求めているのではないかと思います。月の最初と最後の曜日が必要な場合は、これでうまくいきます。
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]
週の最初の日を使用するには:
select dateadd(wk, datediff(wk, 0, getdate()), 0)
最終日は初日+6になります:
select dateadd(wk, datediff(wk, 0, getdate()), 0) + 6
警告:これは文化に敏感です。@@datefirstのドキュメントを確認してください
要件が明確ではありません。週の最初と最後の日は何だと思いますか。日曜日と土曜日?月曜日と金曜日?月曜日と日曜日?ただし、日付に関連する多くのクエリの最善の解決策は、カレンダーテーブルを作成することです。これにより、定義に応じて、必要に応じて複数の形式で、週、月、年の最初と最後の日を簡単に設定できます。
これは、会計年度や営業日など、国や会社によって定義が異なる概念を扱う場合に特に便利です。また、ロジックに例外がある場合、たとえば年の最初の週が「通常の」週とは異なるルールを持っている場合にも、これは最も簡単な解決策です。
カレンダーテーブルを使用すると、週の最初と最後の曜日を事前に入力して、クエリを次のようにすることができます。
-- 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
以下は、日付値のWeekbeginを作成するために使用できるcaseステートメントです。@pDateとして設定した曜日に応じて、月曜日、火曜日、または水曜日などに週が開始されます。
パラメータを作成する
DECLARE @pDate Date = NULL --Replace with your date, which will also be the first day of the week
DECLARE @pDatePart SMALLINT = DATEPART(dw, @pDate)
次に、このcaseステートメントを選択の後に配置します
CASE
WHEN DATEPART(dw, CAST(DATEVALUE AS DATE)) BETWEEN @pDatePart AND 7 THEN DATEADD(d, (DATEPART(dw, CAST(DATEVALUE AS DATE))*-1)+@pDatePart, 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
dateadd(d、6、THE CASE STATEMENT)を使用するだけで、いつでも週の最終日を取得できます。
ここで私は与えました
週、月、四半期、半年、年の開始日と終了日。
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