- ベストアンサー
SQL Server 2000を使用して土日を除いた日数を取得する方法について
- SQL Server 2000を使用して土日を除いた日数を取得する方法を教えてください。
- テーブルに日付列がある場合、土日を除いた日数を取得する方法はありますか?
- SQL Server 2000を使って土日を除いた日数を取得する方法について教えてください。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
DATEDIFFは片端ですから、dateAは含まれないということですかね。 計算でも見づらくはなりますが、できることはできますよ。 期間内最初の土曜、日曜をそれぞれ求めて、残りの期間を7で割って回数を求めます。 SELECT dateA, dateB, DATEDIFF(d,dateA,dateB) -CASE WHEN DATEADD(d,7-DATEPART(dw,DATEADD(d,1,dateA)),DATEADD(d,1,dateA))>dateB THEN 0 ELSE DATEDIFF(d,DATEADD(d,7-DATEPART(dw,DATEADD(d,1,dateA)),DATEADD(d,1,dateA)),dateB)/7+1 END -CASE WHEN DATEADD(d,8-DATEPART(dw,dateA),dateA)>dateB THEN 0 ELSE DATEDIFF(d,DATEADD(d,8-DATEPART(dw,dateA),dateA),dateB)/7+1 END FROM T_TEST
その他の回答 (1)
- nn1102
- ベストアンサー率80% (12/15)
こういったスカラ値関数をつくってやって CREATE FUNCTION [dbo].[DAYCOUNT](@DATEA DATETIME, @DATEB DATETIME) RETURNS INT AS BEGIN DECLARE @Count INT SET @Count = 0 DECLARE @CurrentDate DATETIME SET @CurrentDate = @DATEA WHILE @CurrentDate <= @DATEB BEGIN DECLARE @WEEK INT SET @WEEK = CAST(DATEPART(WEEKDAY, @CurrentDate) AS INT) IF (@WEEK <> 1) AND (@WEEK <> 7) BEGIN SET @Count = @Count + 1 END SET @CurrentDate = DATEADD(DAY, 1, @CurrentDate) END RETURN @Count END それで、SELECT を発行するのはどうでしょうか。 SELECT DATEA, DATEB, dbo.DAYCOUNT(DATEA, DATEB) FROM T_TEST
お礼
nn1102さん ありがとうございます。 ユーザ定義関数を作成する、という発想がなかったです。 ループで日数をカウントってかなり処理に時間がかかりそうで気になったんですが、 実運用で想定されている規模が「総レコード50万件から3万件を抽出する」で クエリアナライザにてテストすると約6秒でした。思ったよりも早かったです。 (50万件全件抽出だと10分以上かかりました。) 参考にさせていただきます。 ユーザ定義関数を使用せずにやってみる方法も考えてみたいと思います。
お礼
jamshid6さん ありがとうございます。 レコード毎にユーザ定義関数にて計算するよりも早いですね。 回答番号:No.1 の nn1102さんの場合もそうでしたが、[dateA]や[dateB]に時刻まで登録されている場合、単純な DATEDIFF() とは計算結果が異なる場合がありました。 例えば、 [dateA] = #2010/05/19 12:00:00# [dateB] = #2010/05/20 11:59:59# だったとすると、DATEDIFF() は 1 となりますが、この場合は 0 となってしまいます。 その点を考慮し、 SELECT dateA, dateB, DATEDIFF(d, dateA, dateB) - CASE WHEN CAST(CONVERT(varchar, DATEADD(d, 7 - DATEPART(dw, DATEADD(d, 1, dateA)), DATEADD(d, 1, dateA)), 111) AS DATETIME) > dateB THEN 0 ELSE DATEDIFF(d, DATEADD(d, 7 - DATEPART(dw, DATEADD(d, 1, dateA)), DATEADD(d, 1, dateA)), dateB) / 7 + 1 END - CASE WHEN CAST(CONVERT(varchar, DATEADD(d, 8 - DATEPART(dw, dateA), dateA, 111) AS DATETIME) > dateB THEN 0 ELSE DATEDIFF(d, DATEADD(d, 8 - DATEPART(dw, dateA), dateA), dateB) / 7 + 1 END FROM T_Test としてみました。 お二人ともご助言くださりまして、ありがとうございました!