web-dev-qa-db-ja.com

MS SQL Server 2005で日付から週番号を取得しますか?

週番号(曜日ではなく、週の日番号)を選択するSQLステートメントを作成することは可能ですか?この追加情報を他のいくつかのフィールドと一緒に選択するビューを作成しているため、ストアドプロシージャを使用できません。トリックを実行するためにUDFを作成することは可能であることを私は知っていますが、可能であれば、ビューと関数の両方ではなく、このデータベースにビューを追加するだけで済みます。

何か案は?また、私の出身地では、週は月曜日に始まり、第1週は少なくとも4日で年の最初の週です。

関連:

日付を指定して週番号を計算するにはどうすればよいですか?

文化によって、正しい週番号と見なされるものに違いがあることに注意してください。週数は国ごとに異なるいくつかの仮定に依存します。 この問題に関するウィキペディアの記事 を参照してください。週番号に適用される ISO標準 (ISO 8601)があります。

SQLサーバーに統合されたDATEPART()関数は、必ずしも正しいことを行うとは限りません。 SQL Serverは、多くのアプリケーションで、第1週の1日目が1月1日であると想定しています。

週数を正しく計算することは簡単ではなく、さまざまな実装がWeb上にあります。たとえば、 1930〜 2030年のISO週番号 を計算するUDFがあり、他にも多数あります。何が効果的かを確認する必要があります。

これは Books Online からのものです(おそらく使用したいと思うでしょうが Jonas Lincolnの回答からのもの 、BOLバージョンは正しくないようです):

CREATE FUNCTION ISOweek  (@DATE DATETIME)
RETURNS INT
AS
BEGIN
   DECLARE @ISOweek INT
   SET @ISOweek = DATEPART(wk,@DATE) 
                  +1 
                  -DATEPART(wk,CAST(DATEPART(yy,@DATE) AS CHAR(4))+'0104')
   -- Special cases: Jan 1-3 may belong to the previous year
   IF (@ISOweek=0)
      SET @ISOweek = dbo.ISOweek(CAST(DATEPART(yy,@DATE) - 1
                     AS CHAR(4))+'12'+ CAST(24+DATEPART(DAY,@DATE) AS CHAR(2)))+1
   -- Special case: Dec 29-31 may belong to the next year
   IF ((DATEPART(mm,@DATE)=12) AND
      ((DATEPART(dd,@DATE)-DATEPART(dw,@DATE))>= 28))
      SET @ISOweek=1
   RETURN(@ISOweek)
END
GO
18
Tomalak

ISO週が必要です。 http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=6051 から、実装は次のとおりです。

drop function dbo.F_ISO_WEEK_OF_YEAR
go
create function dbo.F_ISO_WEEK_OF_YEAR
    (
    @Date   datetime
    )
returns     int
as
/*
Function F_ISO_WEEK_OF_YEAR returns the
ISO 8601 week of the year for the date passed.
*/
begin

declare @WeekOfYear     int

select
    -- Compute week of year as (days since start of year/7)+1
    -- Division by 7 gives whole weeks since start of year.
    -- Adding 1 starts week number at 1, instead of zero.
    @WeekOfYear =
    (datediff(dd,
    -- Case finds start of year
    case
    when    NextYrStart <= @date
    then    NextYrStart
    when    CurrYrStart <= @date
    then    CurrYrStart
    else    PriorYrStart
    end,@date)/7)+1
from
    (
    select
        -- First day of first week of prior year
        PriorYrStart =
        dateadd(dd,(datediff(dd,-53690,dateadd(yy,-1,aa.Jan4))/7)*7,-53690),
        -- First day of first week of current year
        CurrYrStart =
        dateadd(dd,(datediff(dd,-53690,aa.Jan4)/7)*7,-53690),
        -- First day of first week of next year
        NextYrStart =
        dateadd(dd,(datediff(dd,-53690,dateadd(yy,1,aa.Jan4))/7)*7,-53690)
    from
        (
        select
            --Find Jan 4 for the year of the input date
            Jan4    = 
            dateadd(dd,3,dateadd(yy,datediff(yy,0,@date),0))
        ) aa
    ) a

return @WeekOfYear

end
go
18
Jonas Lincoln

DATEPART mssql関数 のように見えます...

DATEPART(wk, ‘Jan 1, xxxx’) = 1

さて、私は..週の最初の日を設定する方法があることがわかりました [〜#〜] datefirst [〜#〜]

SET DATEFIRST 1 -- for monday

Update:OPが何を望んでいるのかがよくわかりました。これは、このためのカスタムロジックです。 MSSQLには、これほど豊富なレベルのカスタマイズを備えた機能はないと思います。しかし、私は間違っているかもしれません...私はあなたがここであなた自身のUDFを転がさなければならないと思います...ごめんなさい

4
Gishu

他の答えを忘れる

質問は「週は月曜日に始まり、第1週は少なくとも4日で年の最初の週です。 "これはISO 8601標準であり、この回答が何を提供するかを指定します。この機能は、当サイトの本番環境で使用されています。

必要なのはこれだけです。

CREATE FUNCTION ISOweek  (@DATE DATETIME)
RETURNS INT
AS
BEGIN
    RETURN (datepart(DY, datediff(d, 0, @DATE) / 7 * 7 + 3)+6) / 7
END
GO
2
Ian

これにより、引用符で囲まれた日付の週番号が返されます

SELECT DATEPART( wk, 'enter the date over here' )
1
Samiksha

wEEK関数の使用を検討しましたか?

これにより、渡した指定の日付の週が取得されます。

SELECT { fn WEEK(GETDATE()) } AS WeekNumber, { fn WEEK(CONVERT(DATETIME, '2008-01-01 00:00:00', 102)) } AS FirstWeekOfYear, { fn WEEK(CONVERT(DATETIME, '2008-12-31 00:00:00', 102)) } AS LastWeekOfYear

これにより、次のSQL2000およびSQL2005が出力されます。

  • 週番号:50
  • FirstWeekOfYear:1
  • LastWeekOfYear:53

これがお役に立てば幸いです:)

0
Doctor Jones

なぜまたしても、人々はほくろの丘から山を作ります、それは私を驚かせますか?

とても簡単...

select DATEPART(wk, GETDATE())
0
Fandango68

Datepartを使用すると、途中で移動できるように見えますが、特定の年の1月1日の曜日に基づいて、正しい週番号を取得するように調整する必要があります。私はそれを行うのに十分なT-SQLに精通していませんが、それは可能であるはずです。 MySQL のようにモード引数がないのは残念です

0
ysth