web-dev-qa-db-ja.com

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

2009年1月1日の日付があれば、それが何日だったかを調べたいです。月曜日、火曜日など.

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

331
aaaa

DATENAME または DATEPART を使用します。

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

SQLMenaceの答えは受け入れられていますが、知っておくべき重要なSETオプションが1つあります。

SET DATEFIRST

_ datename _ は正しい日付を返します name しかし同じではありません _ 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
90
Sung M. Kim
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
24
Sutirth

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

より良い解決策については、次のサイトをチェックしてください。 MS SQL:Day of Week

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

12
lazerwire.com

ヨーロッパ:

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

SQL Server 2012以降では、FORMAT関数を使用できます。

SELECT FORMAT(GETDATE(), 'dddd')
6
Chris Stillwell

これは私のコードの作業コピーです、それをチェックし、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
3
Tapan kumar

@@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
Minh Nguyen

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

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