2012-06-11 17 views
5

Also was ich versuche zu generieren ist alle Stunden, die in einem bestimmten Zeitraum sind.Erhalten Sie jede Stunde für einen Zeitbereich

So ist der Bereich von 11.00 Uhr bis 14.00 Uhr gegeben, würde ich:

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

ich ein Geschäft jede bestimmte Stunde zu speichern, um zu vermeiden versuche, offen sein könnte und speichern nur den Bereich (I müssen die Stunden gegen andere Zeiten vergleichen)

Dank

+2

Speichern Sie einfach die 'OpenTime' und die' ClosedTime' in der db, und machen Sie Ihre Vergleiche in Code?!?! –

+0

Welche Version von SQL Server? – Lamak

+0

@Lamak: 2008 r2 – Limey

Antwort

5

Wenn Sie eine numbers table (den Link klicken, um eine zu erstellen, wenn Sie es nicht tun) ...

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) 

Wenn dies spezialisiert ist, können Sie eine Stunden-Tabelle mit nur 24 Werten erstellen.

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

@David Es ist etwas anders. Meine ursprüngliche Antwort sagte auch, die Stunden-Tabelle als eine Option zu erstellen, aber ich habe kein Beispiel hinzugefügt, um zu zeigen, wie es funktionieren würde. Entschuldigung, wenn es scheint, habe ich Ihren Vorschlag gestohlen. – Zhenny

+0

Entschuldigung. Es sah aus, als hättest du deine Antwort erstellt, und nachdem du meine Antwort gesehen hast, hast du deine Meinung geändert und auch meine Antwort geschrieben. Ich entschuldige mich. –

4

der einfachste Weg, ich denken kann, dies zu tun ist, um nur 1 permanente Tabelle mit einer Liste aller Stunden zu haben; 24 Einträge insgesamt.

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

Dann angegebenen Zeiten A & B:

select * from dbo.Hours where Hourly_Time<=A and Hourly_Time>=B 
+1

Ich mag diese Idee, ich werde dies eine Chance geben. – Limey

+0

'= <' and '=>'? –

+0

Ich weiß was sie bedeuten; Hast du die Syntax ausprobiert, die du geschrieben hast? 'IF 1 = <2 PRINT 'um';' ergibt 'Msg 102, Level 15, State 1, Line 1 Falsche Syntax in der Nähe von '<'.' –

7

Sie könnten ein rekursives CTE verwenden. Dies würde erzeugen, um die Stunden zwischen 11 und 14:

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

Live example at SQL Fiddle.

+0

Ich mag es am besten, aber es gibt eine int und nicht eine Zeit, aber ich bin sicher, ich kann ändern, um mit einer Zeit zu arbeiten – Limey

+0

@AaronBertrand: yeah, ich meinte Int und Zeit, ich habe meinen Kommentar bearbeitet. – Limey

11

keine Schleifen, rekursiven CTEs oder Nummern-Tabelle erforderlich.

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; 
+2

Ich fühle mich immer schleimig mit sys Tabellen auf diese Weise. Es fühlt sich ein wenig hackisch an. – Zhenny

+1

@Zhenny Nun, ich bevorzuge eine 'Numbers'-Tabelle persönlich, aber bis jemand mit SQL Server ausgeliefert wird, versuche jeden zu überzeugen, einen zu erstellen. [Bitte abstimmen und kommentieren, vielleicht bekommen wir einen in der nächsten Version] (http://connect.microsoft.com/SQLServer/feedback/details/258733/add-a-built-in-table-of-numbers) ! –

+1

Gibt es eine Möglichkeit, diese Lösung zu ändern, um einen Tageswechsel zu berücksichtigen? Zum Beispiel, wenn Sie jede Stunde zwischen 23 Uhr Montag bis 2 Uhr Dienstag wollten –

0

@Andomar Vielen Dank, Sie haben mir geholfen, da ist meine hinzufügen über Ihrem Code.

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

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) 
----------------------------* 
Verwandte Themen