週番号(曜日ではなく、週の日番号)を選択する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
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
DATEPART mssql関数 のように見えます...
DATEPART(wk, ‘Jan 1, xxxx’) = 1
さて、私は..週の最初の日を設定する方法があることがわかりました [〜#〜] datefirst [〜#〜]
SET DATEFIRST 1 -- for monday
Update:OPが何を望んでいるのかがよくわかりました。これは、このためのカスタムロジックです。 MSSQLには、これほど豊富なレベルのカスタマイズを備えた機能はないと思います。しかし、私は間違っているかもしれません...私はあなたがここであなた自身のUDFを転がさなければならないと思います...ごめんなさい
他の答えを忘れる
質問は「週は月曜日に始まり、第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
これにより、引用符で囲まれた日付の週番号が返されます
SELECT DATEPART( wk, 'enter the date over here' )
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が出力されます。
これがお役に立てば幸いです:)
なぜまたしても、人々はほくろの丘から山を作ります、それは私を驚かせますか?
とても簡単...
select DATEPART(wk, GETDATE())
Datepartを使用すると、途中で移動できるように見えますが、特定の年の1月1日の曜日に基づいて、正しい週番号を取得するように調整する必要があります。私はそれを行うのに十分なT-SQLに精通していませんが、それは可能であるはずです。 MySQL のようにモード引数がないのは残念です