2009年1月1日の日付がある場合、月曜日、火曜日などの日付を知りたい
SQL Server 2005/2008には、このための組み込み関数はありますか?または、補助テーブルを使用する必要がありますか?
2009年1月1日の日付がある場合、月曜日、火曜日などの日付を知りたい
SQL Server 2005/2008には、このための組み込み関数はありますか?または、補助テーブルを使用する必要がありますか?
回答:
SQLMenaceの回答は受け入れられましたが、SET
注意すべき重要なオプションが1つあります
以下に示すように、週の最初の曜日が変更されている場合、DATENAMEは正しい日付名を返しますが、同じDATEPART値は返しません。
declare @DefaultDateFirst int
set @DefaultDateFirst = @@datefirst
--; 7 First day of week is "Sunday" by default
select [@DefaultDateFirst] = @DefaultDateFirst
set datefirst @DefaultDateFirst
select datename(dw,getdate()) -- Saturday
select datepart(dw,getdate()) -- 7
--; Set the first day of week to * TUESDAY *
--; (some people start their week on Tuesdays...)
set datefirst 2
select datename(dw,getdate()) -- Saturday
--; Returns 5 because Saturday is the 5th day since Tuesday.
--; Tue 1, Wed 2, Th 3, Fri 4, Sat 5
select datepart(dw,getdate()) -- 5 <-- It's not 7!
set datefirst @DefaultDateFirst
( @@datefirst - 1 + datepart(weekday, thedate) ) % 7
。日曜日は常にゼロになります。
DayOfWeek
列挙がDayOfWeek.Sunday
...の値を持つことです0
。したがって、何DateFirst
が設定されていても、未処理の SQL戻りWEEKDAY
値は、.NETの対応する値と互換性がありません。やあ、マイクロソフト。
SELECT CASE DATEPART(WEEKDAY,GETDATE())
WHEN 1 THEN 'SUNDAY'
WHEN 2 THEN 'MONDAY'
WHEN 3 THEN 'TUESDAY'
WHEN 4 THEN 'WEDNESDAY'
WHEN 5 THEN 'THURSDAY'
WHEN 6 THEN 'FRIDAY'
WHEN 7 THEN 'SATURDAY'
END
select datename(dw,getdate())
特定の日付の曜日の確定的な値を取得するには、DATEPART()と@@ datefirstの組み合わせを使用できます。それ以外の場合は、サーバーの設定に依存します。
より良い解決策については、次のサイトを確認してください 。MSSQL:曜日
曜日は0〜6の範囲になります。0は日曜日、1は月曜日です。その後、単純なcaseステートメントを使用して正しい曜日名を返すことができます。
ヨーロッパ:
declare @d datetime;
set @d=getdate();
set @dow=((datepart(dw,@d) + @@DATEFIRST-2) % 7+1);
SQL Server 2012以降では、FORMAT
関数を使用できます
SELECT FORMAT(GETDATE(), 'dddd')
これは私のコードの作業用コピーです。SQLで日付から曜日名を取得する方法を確認してください。
CREATE Procedure [dbo].[proc_GetProjectDeploymentTimeSheetData]
@FromDate date,
@ToDate date
As
Begin
select p.ProjectName + ' ( ' + st.Time +' '+'-'+' '+et.Time +' )' as ProjectDeatils,
datename(dw,pts.StartDate) as 'Day'
from
ProjectTimeSheet pts
join Projects p on pts.ProjectID=p.ID
join Timing st on pts.StartTimingId=st.Id
join Timing et on pts.EndTimingId=et.Id
where pts.StartDate >= @FromDate
and pts.StartDate <= @ToDate
END
に依存したくない、@@DATEFIRST
または使用したくない場合DATEPART(weekday, DateColumn)
は、自分で曜日を計算してください。
月曜日ベースの週(ヨーロッパ)の場合、最も単純なものは次のとおりです。
SELECT DATEDIFF(day, '17530101', DateColumn) % 7 + 1 AS MondayBasedDay
日曜日ベースの週(アメリカ)の場合:
SELECT DATEDIFF(day, '17530107', DateColumn) % 7 + 1 AS SundayBasedDay
これは、1753年1月1日からのそれぞれの平日番号(1から7)をそれぞれ返します。
使用できますDATEPART(dw, GETDATE())
が、結果はSQLサーバーの設定に依存することに注意してください@@DATEFIRST
週の最初の曜日の値に(ヨーロッパではデフォルト値7、つまり日曜日)。
週の最初の日を別の値に変更したい場合は、 SET DATEFIRST
が、これはクエリセッションの不要なすべての場所に影響を与える可能性があります。
別の方法は、最初の曜日の値をパラメーターとして明示的に指定し、@@DATEFIRST
設定に依存しないようにすることです。次の式を使用して、必要なときにそれを実現できます。
(DATEPART(dw, GETDATE()) + @@DATEFIRST + 6 - @WeekStartDay) % 7 + 1
どこ @WeekStartDay
で、システムに希望する週の最初の日です(1から7は月曜日から日曜日を意味します)。
私はそれを以下の関数にラップして、簡単に再利用できるようにしました:
CREATE FUNCTION [dbo].[GetDayInWeek](@InputDateTime DATETIME, @WeekStartDay INT)
RETURNS INT
AS
BEGIN
--Note: @WeekStartDay is number from [1 - 7] which is from Monday to Sunday
RETURN (DATEPART(dw, @InputDateTime) + @@DATEFIRST + 6 - @WeekStartDay) % 7 + 1
END
使用例:
GetDayInWeek('2019-02-04 00:00:00', 1)
これは以下と同等です(ただし、SQLサーバーのDATEFIRST設定とは無関係です)。
SET DATEFIRST 1
DATEPART(dw, '2019-02-04 00:00:00')
このバージョンは便利です。
-- Test DATA
select @@datefirst
create table #test (datum datetime)
insert #test values ('2013-01-01')
insert #test values ('2013-01-02')
insert #test values ('2013-01-03')
insert #test values ('2013-01-04')
insert #test values ('2013-01-05')
insert #test values ('2013-01-06')
insert #test values ('2013-01-07')
insert #test values ('2013-01-08')
-- Test DATA
select Substring('Sun,Mon,Tue,Wed,Thu,Fri,Sat,Sun,Mon,Tue,Wed,Thu,Fri,Sat',
(DATEPART(WEEKDAY,datum)+@@datefirst-1)*4+1,3),Datum
from #test