6

だから私がしようとしているのは、特定の時間範囲内にあるすべての時間を生成することです。

したがって、午前 11 時から午後 2 時までの範囲を指定すると、次のようになります。

 11:00 AM
 12:00 PM
 1:00 PM
 2:00 PM

店舗が開いている可能性のある特定の時間ごとに保存する必要がないようにし、範囲を保存するだけです(時間を他の時間と比較する必要があります)

ありがとう

4

5 に答える 5

13

ループ、再帰 CTE、数値テーブルは必要ありません。

DECLARE 
  @start TIME(0) = '11:00 AM', 
  @end   TIME(0) =  '2:00 PM';

WITH x(n) AS 
(
  SELECT TOP (DATEDIFF(HOUR, @start, @end) + 1) 
  rn = ROW_NUMBER() OVER (ORDER BY [object_id]) 
  FROM sys.all_columns ORDER BY [object_id]
)
SELECT t = DATEADD(HOUR, n-1, @start) FROM x ORDER BY t;
于 2012-06-11T20:02:41.100 に答える
7

再帰的な CTE を使用できます。これにより、11 から 14 までの時間が生成されます。

;with   Hours as
        (
        select  11 as hr
        union all
        select  hr + 1
        from    Hours
        where   hr < 14
        )
select  *
from    Hours

SQL Fiddle での実例。

于 2012-06-11T19:51:07.470 に答える
5

数値表がある場合(ない場合は、リンクをクリックして作成してください)...

create table test(
    startTime time
,   endTime time
)

insert into test
select '11:00', '14:00'

select
    dateadd(hh, n.n, t.startTime) as times
from test t
  inner join Numbers n
    -- assuming your numbers start at 1 rather than 0
    on n.n-1 <= datediff(hh, t.startTime, t.endTime)

これが特殊な場合は、24 個の値だけで時間テーブルを作成できます。

create table HoursInADay(
    [hours] time not null
,   constraint PK_HoursInADay primary key ([hours])
)

-- insert
insert into HoursInADay select '1:00'
insert into HoursInADay select '2:00'
insert into HoursInADay select '3:00'
insert into HoursInADay select '4:00'
insert into HoursInADay select '5:00'
insert into HoursInADay select '6:00'
insert into HoursInADay select '7:00'
...

select
    h.[hours]
from test t
  inner join HoursInADay h
    on h.[hours] between t.startTime and t.endTime
于 2012-06-11T19:41:59.043 に答える
4

これを行うために私が考えることができる最も簡単な方法は、すべての時間のリストを含む永続的なテーブルを1つだけ持つことです。合計24エントリ。

Create table dbo.Hours (Hourly_Time Time NOT NULL)
Insert into dbo.Hours ...

次に、与えられた時間AとB:

select * from dbo.Hours where Hourly_Time<=A and Hourly_Time>=B
于 2012-06-11T19:36:26.693 に答える
0

@Andomarどうもありがとう、あなたは私を助けてくれました、あなたのコードの上に私の追加があります。

*----------------------------

create view vw_hoursalot as 
  with Hours as
  (
      select DATEADD(
        dd, 0, DATEDIFF(
              dd, 0, DATEADD (
                    year , -5 , getDate() 
                  )
            )
      ) as dtHr
    union all
      select DATEADD (minute , 30 , dtHr ) 
        from Hours
        where dtHr < DATEADD(
            dd, 0, DATEDIFF(
                  dd, 0, DATEADD (
                        year , +5 , getDate() 
                      )
                )
        )
  )  
  select * from Hours
----------------------------  
select * from vw_hoursalot option (maxrecursion 0)
----------------------------*
于 2014-02-27T17:03:46.660 に答える