3

1 か月に 1 週​​間ごとにデータベース内のレコードを取得する方法を教えてください。SQL を使用しています。本当の意味は、1 を入力すると、その月の第 1 週にレコードが取得されるということです。今日は多くの調査を行いましたが、適切な解決策が見つからないようです。

コードは次のとおりです。

DECLARE @MONTH int
DECLARE @YEAR int
DECLARE @WEEK int

SET @MONTH = 9
SET @YEAR = 2013
SET @WEEK = 1

SELECT RH.RepairOrderNumber FROM dbo.RepairOrderHeader RH
WHERE MONTH(RH.DateReleased) = @MONTH AND YEAR(RH.DateReleased) = @YEAR AND WEEK(RH.DateReleased) = @WEEK

月、年に従ってレコードを取得したいだけですが、これを行う方法と正確なコードはありますか?

4

4 に答える 4

0

'2013-08-26' - '2013-09-01' を 9 月の最初の週とします

DECLARE @MONTH int = 9
DECLARE @YEAR int = 2013
DECLARE @WEEK int = 1

DECLARE @from date= dateadd(day, datediff(day, -(@WEEK - 1)*7, 
       (dateadd(month, (@year-1900) * 12 + @month - 1 , 0)))/7*7 , 0)

SELECT RH.RepairOrderNumber 
FROM dbo.RepairOrderHeader RH
WHERE RH.DateReleased >= @from
and RH.DateReleased < dateadd(week, 1, @from)
于 2013-09-26T12:46:18.137 に答える
0

WEEK一定の曜日 (つまり、毎週日曜日) から始まる、通年の週を返します。月の週が必要なようですが、これは常に毎月1日に始まると思います。

それで:

SELECT RH.RepairOrderNumber FROM dbo.RepairOrderHeader RH
WHERE  MONTH(RH.DateReleased) = @MONTH AND 
       YEAR(RH.DateReleased) = @YEAR AND 
       DAY(RH.DateReleased) / 7 + 1 = @WEEK
于 2013-09-26T11:35:37.543 に答える
0

可能な場合は、WHERE 句の列で関数を使用しないでください。これらの列のインデックスを利用する機能はすぐに失われます。以下のソリューションは、選択した回答と同じ結果をもたらしますが、パフォーマンスははるかに優れています。

DECLARE @MONTH INT = 9
DECLARE @YEAR INT = 2013
DECLARE @WEEK INT = 2

--1ST OF THE MONTH DECLARED
DECLARE @Date DATE = CAST(CAST(@Year AS VARCHAR(4)) + 
                    RIGHT('0' + CAST(@Month AS VARCHAR(2)), 2) + '01' AS DATE)

SET  @Date = DATEADD(WEEK, @Week - 1, DATEADD(DAY, 1 - DATEPART(WEEKDAY, @Date), @Date));

SELECT  RH.RepairOrderNumber 
FROM    dbo.RepairOrderHeader RH
WHERE   RH.DateReleased >= @Date
AND     RH.DateReleased < DATEADD(WEEK, 1, @Date);

これは、問題の月の最初を取得し、その月の最初が属する週の最初の日を見つけるだけです。次に、宣言された週数をこの日付に追加します。

6 年間のデータと 1 日あたり 10 行 (20,480 レコードなので、多くはない) と日付列のインデックスを含むテーブルの例と、これの実行計画と受け入れられた回答は次のとおりです (上で受け入れられ、使用下部の日付):

ここに画像の説明を入力

SQL-Fiddle での DDL とクエリのテスト

これは、使用WEEK(DateColumn) = @Weekするとインデックスがまったく使用されず、クエリのコストがはるかに高くなることを示しています。テーブル内のデータの分布に応じて、これは大きな違いを生む可能性があります。私の例の小さなデータセットであっても、800% 効率的です。

于 2013-09-26T11:45:38.077 に答える