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)

基本上,我需要查询一个表来获取DMCDur可以是:30、20、15等的列。分别代表:30分钟、20分钟、15分钟。

我需要将开始时间设置为8:00 am并需要添加DMCDur此开始时间并生成一组时间间隔为 asDMCDur并将这些值插入我上面提到的表变量中。

我的最终目标是将这组时间与另一个表数据连接起来并填充一个网格。于是想到了这条路。

请就此提出您的想法。我们将不胜感激提供相同的示例存储过程。注意:加入另一个表中的变量是一个 DATETIME 变量(eg 2012-08-06 08:00:00.000)。所以表变量也应该是 DATETIME 作为数据类型,这样我就可以用这个时间加入两个表。

4

2 回答 2

2

您应该使用行生成器。我使用 Itzik Ben Gan 的行生成器

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 更改要求:

您可以将日期时间转换为时间以获取时间部分:

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 回答