- - PR -
T-SQLでのDateTimeをループ処理
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 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 ------------------------------------------------------------- よろしくお願いします。 | ||||
|
投稿日時: 2007-05-17 12:04
ストアドプロシージャであれば、こんな感じで実現できると思います。
| ||||
|
投稿日時: 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で変更しなければいけないのでしょうか? よろしくお願いします。 | ||||
|
投稿日時: 2007-05-22 13:00
テーブルのtime1とかtime2の型はなんですか?
| ||||
|
投稿日時: 2007-05-22 14:11
DateTime型です
| ||||
|
投稿日時: 2007-05-22 15:08
DateTime型のカラムの内容をDateTime型の@time1に入れるのであれば、
「文字列を日付型に変換できませんでした」 というエラーは起きないと思います。 なんらかの文字列を@time1に入れようとしていませんか? もし、差支えがなければ、ケイさんが書かれたストアドプロシージャを ここに載せて頂けないでしょうか。 もう少し具体的なアドバイスが得られるかもしれません。 | ||||
|
投稿日時: 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 =================================== | ||||
|
投稿日時: 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 --------------------------------- |