0

以下のようにテーブル変数を宣言しています。

declare @TableVar table ( interval  Time not null) 

このテーブル変数に、「午前 8:00」から「午後 8:00」までの時間として、たとえば 30 分間隔で値を挿入する必要があります。

以下のようなデータを含むテーブル変数が必要です

8:00 am
8:30 am
9:00 am
.
.
.
12:00 pm
12.30 pm
.
.
7:00 pm
7:30 pm
8:00 pm

この 30 分の時間間隔は、テーブルのフィールド DMCDur(int)から取得されます。

DECLARE @intFlag INT
SET @intFlag = (select D.DMCDur from doctor_master D where D.doc_id=3)

基本的に、テーブルをクエリして、30、20、15 などの列を取得する必要がありますDMCDur。それぞれ 30 分、20 分、15 分を表します。

開始時刻を次のように設定し、この開始時刻8:00 amを追加DMCDurして、一連の間隔を次のように生成し、DMCDurこれらの値を上記のテーブル変数に挿入する必要があります。

最終的な目的は、この時間のセットを別のテーブル データと結合して、グリッドに入力することです。それで、この方法で行くことを考えました。

これについてのアイデアを提案してください。同じストアド プロシージャのサンプルをいただければ幸いです。注:他のテーブルの結合変数は DATETIME 変数( eg 2012-08-06 08:00:00.000) です。したがって、テーブル変数もデータ型として DATETIME にする必要があるため、この時間で両方のテーブルを結合できます。

4

2 に答える 2

2

行ジェネレーターを使用する必要があります。Itzik Ben Gan の Row Generatorを使用します 。

create table #TableVar  ( interval  Time not null) 

declare @elapsed int
declare @from_time time, 
        @to_time time
select @elapsed = 30, 
       @from_time = '08:00:00', 
       @to_time = '20:00:00'

;WITH 
Nbrs_3( n ) AS ( SELECT 1 UNION SELECT 0 ),
Nbrs_2( n ) AS ( SELECT 1 FROM Nbrs_3 n1 CROSS JOIN Nbrs_3 n2 ),
Nbrs_1( n ) AS ( SELECT 1 FROM Nbrs_2 n1 CROSS JOIN Nbrs_2 n2 ),
Nbrs_0( n ) AS ( SELECT 1 FROM Nbrs_1 n1 CROSS JOIN Nbrs_1 n2 ),
Nbrs ( n ) AS ( SELECT 1 FROM Nbrs_0 n1 CROSS JOIN Nbrs_0 n2 ),
D ( n ) as (SELECT ROW_NUMBER()  OVER (ORDER BY n) FROM Nbrs  ),
all_times as (
  SELECT 
     dateadd( minute, ( n - 1) * @elapsed, @from_time) as [a_time]
  FROM 
     D
  where
     n <= ( 12 * 60.0 / @elapsed ) + 1
)
insert 
into #TableVar 
select * from all_times

結果:

;select * from #TableVar


interval 
-------- 
08:00:00 
08:30:00 
09:00:00 
09:30:00 
...
19:00:00 
19:30:00 
20:00:00 

* 編集済み * OP 変更要件による:

datetime を time にキャストして、時間部分を取得できます。

create table #dates  ( some_date  dateTime not null) 

insert into #dates values 
( '2012-01-01 07:30:00' ),
( '2012-01-01 08:00:00' ),
( '2012-01-01 08:30:00' ),
( '2012-01-01 09:00:00' );


select           d.*, t.*
from             #dates d 
left outer join  #TableVar t 
             on  cast( d.some_date as time ) = t.interval;

結果:

some_date             interval 
-------------         -------- 
2012-01-01 07:30:000  _NULL_        
2012-01-01 08:00:000  8:00:00 
2012-01-01 08:30:000  8:30:00 
2012-01-01 09:00:000  9:00:00 
于 2012-08-06T09:10:57.850 に答える
0

これを試して:

DECLARE @intFlag INT
SET @intFlag =30

declare @start_time time='08:00:00'
declare @end_time time='20:00:00'
declare @t table (date_time datetime)

insert into @t
select DATEADD(mi,number*@intFlag,@start_time) as [time]
from master..spt_values where type='p'
and number<=12*(60/@intFlag)

select * from @t

Edit1:あなたの最終的なメモに従って:

 select * from @t join <other table>
 on convert(time,date_time)=convert(time,<othertableColumn >)
于 2012-08-06T09:00:30.833 に答える