SQL Server 2005/2008で曜日を取得する


369

2009年1月1日の日付がある場合、月曜日、火曜日などの日付を知りたい

SQL Server 2005/2008には、このための組み込み関数はありますか?または、補助テーブルを使用する必要がありますか?


1
日付部分のルックアップを含むテーブルがある場合、一般的に何かが間違っています。SQL Serverの日付関数は数多くあり、堅牢であるため、日付から抽出する必要のあるデータはすべて、日時列で簡単に実行できます。
ベンジャミンオーティン2009

6
補助テーブルは日付の計算に非常に役立ちます。カレンダーの補助テーブルがあることも珍しくありません...

2
「日付の計算に便利」は非常に疑わしいです。ほとんどの日付計算は、なんらかの補助テーブルなしで処理でき、パフォーマンスも向上します。場合によっては、プレーンなNumbersテーブルが機能します。実際の日付を含むテーブルは必要ありません。実際のカレンダーテーブルが必要であると私が見た唯一の理由は、どの曜日が稼働日で、どの曜日がそうでないかのルールが非常に複雑な場合です。私があまりにも頻繁に見たのは、他の方法でそれを行う方法がわからないため、日付テーブルを使用している人々です。次に、日付テーブルに頻繁にデータを入力する必要があります。ばか。
ErikE 2009

5
1)複雑な休日/平日のルールには対応していない、2)組み込み関数では簡単に実行できない、3)使用できない場合のみ# 2の場合、Numbersテーブルも同様に機能し、テーブルに特定の日付を入力する必要はありません。
ErikE 2009

2
データウェアハウスは、カレンダーテーブルを多用しています。事前に計算された月、四半期、年などにより、エンドユーザーはフィルタリング/集計できるフィールドを使用できます。
David Rushton、2015

回答:


694

DATENAMEまたはを使用DATEPART

SELECT DATENAME(dw,GETDATE()) -- Friday
SELECT DATEPART(dw,GETDATE()) -- 6

thx、datenameを試しましたが、dを使用して整数を返しました。dwは期待どおりに動作します

39
そのため、select datename(weekday、getdate())を使用することを好みます。dwが平日を返すことを覚えておく必要はありません...代わりに「平日」を使用できます。
ジョージマストロス2009

9
これをちらっと見ている人- デフォルトの週の始まりは日曜日であることに注意してください。これを安全に変更する方法については、@ Sungの回答を
ご覧ください

2
@niicoその理由は、1からSQLインデックスながらC 0から言語インデックス等
user824276

95

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

33
したがって、一定のdatepart値を取得するには、次のようにします( @@datefirst - 1 + datepart(weekday, thedate) ) % 7。日曜日は常にゼロになります。
Endy Tjahjono

1
ちょっと恐ろしいことですが、これは静的なので、クエリの元に従って、値を変更し、クエリを実行し、元のパターンをリセットする必要があります
JonnyRaa

2
これの面白い部分は、.NETのDayOfWeek列挙がDayOfWeek.Sunday...の値を持つことです0。したがって、何DateFirstが設定されていても、未処理の SQL戻りWEEKDAY値は、.NETの対応する値と互換性がありません。やあ、マイクロソフト。
Eric Wu

26
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

26
あなたはそれを達成するための組み込み関数であることを知っておくべきです。select datename(dw,getdate())
Soham Dasgupta 2012

10
@SohamDasguptaこの組み込み関数は、英語以外のバージョンのMS SQLでは同じ結果を返しません。
Scapegrace氏2016年

12

特定の日付の曜日の確定的な値を取得するには、DATEPART()@@ datefirstの組み合わせを使用できます。それ以外の場合は、サーバーの設定に依存します。

より良い解決策については、次のサイトを確認してください 。MSSQL:曜日

曜日は0〜6の範囲になります。0は日曜日、1は月曜日です。その後、単純なcaseステートメントを使用して正しい曜日名を返すことができます。


5
答えに答えを入れてください。そうすれば、リンクをクリックする必要がなくなります。
マーティン・スミス、

11

ヨーロッパ:

declare @d datetime;
set @d=getdate();
set @dow=((datepart(dw,@d) + @@DATEFIRST-2) % 7+1);

2
あなたのコードが何をするか、そしてそれがどのように質問に答えるかの説明を含めてください。答えとしてコードスニペットを取得した場合、それをどうするかわからない可能性があります。回答は、OPと将来の訪問者に、問題をデバッグして修正する方法に関するガイダンスを提供する必要があります。コードの背後にあるアイデアが何であるかを指摘すると、問題を理解し、ソリューションを適用または変更するのに非常に役立ちます。
Palec 2014


3

これは私のコードの作業用コピーです。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

1

に依存したくない、@@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)をそれぞれ返します。


1

使用できます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')

0

このバージョンは便利です。

-- 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 

1
これはあいまいなコードであり、それが何をしているか、または達成しようとしていることを示していません
brewmanz
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.