- PR -

T-SQLでのDateTimeをループ処理

投稿者投稿内容
ケイ
会議室デビュー日: 2005/04/27
投稿数: 10
投稿日時: 2007-05-17 11:11
こちらでは初めて書き込みをさせて頂きます。

現在T-SQLを使用してのデータベース処理を行っています。
ひとつのテーブル内に2つのDateTime型のコラムがあり同一日で時間のみ違うデータを保持しています。
その二つの間の時間を1時間毎に取得し、表示させるためにはどのようにしたらいいのでしょうか?
DATEADDをループさせれば取得出来るのかと思っているのですが、
どの様にSQL文を書き、ループ処理を行えばいいのでしょうか?

例:
テーブル
------------------------------------------
time1   | time2
------------------------------------------
2000/01/01 10:00:00 | 2000/01/01 17:00:00
------------------------------------------

期待する出力
-------------------------------------------------------------
time1 | time2 | time3 | time4 | time5 | time6 | time7 | time8
-------------------------------------------------------------
10:00 | 11:00 | 12:00 | 13:00 | 14:00 | 15:00 | 16:00 | 17:00
-------------------------------------------------------------

よろしくお願いします。
サトウ
会議室デビュー日: 2006/01/17
投稿数: 17
投稿日時: 2007-05-17 12:04
ストアドプロシージャであれば、こんな感じで実現できると思います。

コード:
 DECLARE @time1 datetime
 DECLARE @time2 datetime
 DECLARE @work  datetime

 -- ここでテーブルからtime1 time2 を取得し、@time1, @time2にセット

 SET @work = @time1
  while @work < @time2
   begin
    set @work = DATEADD(hour, 1, @work)
    print convert(varchar, @work, 108)
   end

ケイ
会議室デビュー日: 2005/04/27
投稿数: 10
投稿日時: 2007-05-21 15:40
返信が遅くなりましたが、
サトウさん、ありがとうございます。

教えていただいたコードで試してみたのですが、
ストアドプロシージャを作成し、その作成したストアドプロシージャを走らせると

"Msg 241, Level 16, State 1, Procedure test, Line 8"
"Conversion failed when converting datetime from character string"

上記のエラーが出てしまい、結果を得ることができませんでした。
8行目なので、調べてみると
DECLARE @time1 datetime
を宣言している行です。

DECLARE時の変数もCASTで変更しなければいけないのでしょうか?
よろしくお願いします。
サトウ
会議室デビュー日: 2006/01/17
投稿数: 17
投稿日時: 2007-05-22 13:00
テーブルのtime1とかtime2の型はなんですか?
ケイ
会議室デビュー日: 2005/04/27
投稿数: 10
投稿日時: 2007-05-22 14:11
DateTime型です
サトウ
会議室デビュー日: 2006/01/17
投稿数: 17
投稿日時: 2007-05-22 15:08
DateTime型のカラムの内容をDateTime型の@time1に入れるのであれば、
「文字列を日付型に変換できませんでした」
というエラーは起きないと思います。
なんらかの文字列を@time1に入れようとしていませんか?

もし、差支えがなければ、ケイさんが書かれたストアドプロシージャを
ここに載せて頂けないでしょうか。

もう少し具体的なアドバイスが得られるかもしれません。
ケイ
会議室デビュー日: 2005/04/27
投稿数: 10
投稿日時: 2007-05-23 19:39
ストアドプロシージャです。
SELECT文に"TOP 1"を入れれば上記のエラーが起こり"TOP 1"を書かなければ"複数の値は代入出来ない"と言うエラーがでます。

===================================
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go

CREATE procedure [dbo].[test] AS

DECLARE @time1 datetime
DECLARE @time2 datetime
DECLARE @work datetime

SET @time1 = (SELECT TOP 1 time1 FROM time_test)
-- SET @time1 = 'SELECT time1 FROM time_test'

SET @time2 = (SELECT TOP 1 time2 FROM time_test)
-- SET @time1 = 'SELECT time2 FROM time_test'

SET @work = @time1
while @work < @time2
begin
set @work = 'DATEADD(hour, 1, @work)'
print convert(nvarchar(2000), @work, 108)
end
===================================
ケイ
会議室デビュー日: 2005/04/27
投稿数: 10
投稿日時: 2007-05-23 19:45
申し訳ありません、テーブル内容を書き忘れていました。
下記がテーブル内容です。

----------------------------------------------------------------------
id | time1    | time2
----------------------------------------------------------------------
1 | 2000/01/01 10:00:00 | 2000/01/01 17:00:00
----------------------------------------------------------------------
2 | 2000/01/03 10:00:00 | 2000/01/01 17:00:00
----------------------------------------------------------------------

テーブルのdefinitionです。
---------------------------------
id | int
---------------------------------
time1 | DateTime
---------------------------------
time2 | DateTime
---------------------------------

スキルアップ/キャリアアップ(JOB@IT)