だから私がしようとしているのは、特定の時間範囲内にあるすべての時間を生成することです。
したがって、午前 11 時から午後 2 時までの範囲を指定すると、次のようになります。
11:00 AM
12:00 PM
1:00 PM
2:00 PM
店舗が開いている可能性のある特定の時間ごとに保存する必要がないようにし、範囲を保存するだけです(時間を他の時間と比較する必要があります)
ありがとう
だから私がしようとしているのは、特定の時間範囲内にあるすべての時間を生成することです。
したがって、午前 11 時から午後 2 時までの範囲を指定すると、次のようになります。
11:00 AM
12:00 PM
1:00 PM
2:00 PM
店舗が開いている可能性のある特定の時間ごとに保存する必要がないようにし、範囲を保存するだけです(時間を他の時間と比較する必要があります)
ありがとう
ループ、再帰 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;
再帰的な CTE を使用できます。これにより、11 から 14 までの時間が生成されます。
;with Hours as
(
select 11 as hr
union all
select hr + 1
from Hours
where hr < 14
)
select *
from Hours
数値表がある場合(ない場合は、リンクをクリックして作成してください)...
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
これを行うために私が考えることができる最も簡単な方法は、すべての時間のリストを含む永続的なテーブルを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
@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)
----------------------------*