SQL Server 2000 を使用しています。
土日を除いた日数を取得したいと思っていますがわからなくて困っています。
ご助言ください。
あるテーブル(T_Test)に日付列が2つあります。
code|dateA |dateB
──┼─────┼──────
1 |2010-05-10|2010-05-14
2 |2010-05-14|2010-05-17
3 |2010-05-10|2010-05-28
ここから
code|dateA |dateB |日数
──┼─────┼─────┼──
1 |2010-05-10|2010-05-14|4
2 |2010-05-14|2010-05-17|1
3 |2010-05-10|2010-05-28|10
というように土日を除いた datediff のような値を取得したいのです。
datediff で日数を取得でき、datepart で曜日を取得することができるようには
なったのですが、土日を除いた日数を取得(もしくは期間内の土日の日数でも可)を
取得する方法がわかりません。
どうぞ宜しくお願いいたします。
No.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
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
としてみました。
お二人ともご助言くださりまして、ありがとうございました!
No.1
- 回答日時:
こういったスカラ値関数をつくってやって
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分以上かかりました。)
参考にさせていただきます。
ユーザ定義関数を使用せずにやってみる方法も考えてみたいと思います。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・チョコミントアイス
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・あなたの習慣について教えてください!!
- ・ハマっている「お菓子」を教えて!
- ・高校三年生の合唱祭で何を歌いましたか?
- ・【大喜利】【投稿~11/1】 存在しそうで存在しないモノマネ芸人の名前を教えてください
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・家の中でのこだわりスペースはどこですか?
- ・つい集めてしまうものはなんですか?
- ・自分のセンスや笑いの好みに影響を受けた作品を教えて
- ・【お題】引っかけ問題(締め切り10月27日(日)23時)
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・ちょっと先の未来クイズ第4問
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・10秒目をつむったら…
- ・人生のプチ美学を教えてください!!
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
sqlserverで集計結果をUPDATEし...
-
.SQLファイルをvbaで実行
-
サーバー破壊
-
SQLサーバで和暦から西暦に変換...
-
sqlserverで対象のレコードを削...
-
SQL クエリ データ数
-
SQL Server management studio ...
-
Tverは無料でしょうか?
-
Accessの重複なしのカウントの...
-
SQLのエラー(~付近に不適切な...
-
SQLサーバーのSELECTについて教...
-
ACCESS2007 フォーム 「バリア...
-
SQLサーバー接続 特定のPCがWin...
-
SQL 不要な文字列を削除したい
-
Visuaal Studio Community 2022...
-
Access2021 「ISNULL関数には引...
-
甘いものがすきなのってなおせ...
-
SQLて何ですか!
-
生え際から顎先まで17.5 頭頂か...
-
sql serveについて
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Accessで最新のレコード...
-
SELECTした結果をSELECTしたい!
-
クエリ式でDcount の代わりは?
-
年、月、日を取得する関数
-
MySQLでもPHPでも出来る処理は...
-
SQLについて教えてください
-
pl/pgsqlで再帰呼び出しは可能...
-
SQL結果に序列を付けるには??
-
フラグをたてるってどういうこ...
-
SELECT INTOで一度に複数の変数...
-
【SQL】他テーブルに含まれる値...
-
sqlに記述できない文字
-
オラクルのUPDATEで複数テーブル
-
truncate tableを使って複数の...
-
既存データをINSERT文にして出...
-
UPDATEで既存のレコードに文字...
-
PostgreSQLのtimestamp型で時間...
-
エラーを起こす方法
-
SELECTした結果に行番号を求めたい
-
SQLで、Join句で結合したテ...
おすすめ情報