Obtener cada hora durante un intervalo de tiempo

Así que lo que estoy tratando es de generar todas las horas que están dentro de un rango de tiempo específico.

Así que, dado que el rango de 11 AM a 2:00 PM, me gustaría conseguir:

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

Estoy tratando de evitar tener que almacenar cada hora concreta de una tienda puede ser abierta y justa de la tienda de la gama (necesito comparar las horas en contra de otras veces)

Gracias

Sólo almacena la OpenTime y la ClosedTime en la db, y hacer comparaciones en el código ?!?!
¿Qué versión de SQL Server?
2008 r2

OriginalEl autor Limey | 2012-06-11

5 respuestas

  1. 5

    Si usted tiene un los números de la tabla (haga clic en el enlace para crear una si no)…

    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)

    Si este es especializada, puede crear una tabla de horas con tan solo 24 valores.

    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
    Es un poco diferente. Mi respuesta original también dijo que para crear la tabla de horas como una opción, pero yo no incluir un ejemplo para mostrar cómo iba a funcionar. Disculpas si parece que me robó tu sugerencia.
    Lo siento. Parecía que se creó respuesta, a continuación, después de ver mi respuesta, cambia tu mente y poner mi respuesta también. Me disculpo.

    OriginalEl autor Zhenny

  2. 11

    No hay bucles, Cte recursiva o los números de la tabla necesario.

    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;
    Siempre me siento baboso uso de sys tablas de esta manera. Se siente un poco hackish.
    Bueno, yo prefiero un Numbers tabla personalmente, pero hasta que uno de los barcos con SQL Server, intentar convencer a todo el mundo para crear uno. por Favor, votar y comentar, tal vez vamos a conseguir uno en la próxima versión!
    Hay una forma de que esta solución podría ser modificado para dar cuenta de un día de cambio? Por ejemplo, si desea cada hora entre las 11 de la noche del lunes a las 2 de la madrugada del martes

    OriginalEl autor Aaron Bertrand

  3. 7

    Usted podría utilizar una CTE recursiva. Esto generará el horario entre las 11 y las 14:

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

    Ejemplo en vivo en SQL Violín.

    Me parece la mejor, pero devuelve un int y no un tiempo, pero estoy seguro de que puedo modificar para que funcione con un tiempo de
    sí, me refería a int y tiempo, he editado mi comentario.

    OriginalEl autor Andomar

  4. 4

    La forma más sencilla que se me ocurre de hacer esto es tener sólo 1 permanente de la tabla con una lista de todas las horas; 24 entradas totales.

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

    Entonces, dado los tiempos de Un & B:

    select * from dbo.Hours where Hourly_Time<=A and Hourly_Time>=B
    Me gusta esta idea, voy a dar a este un tiro.
    =< y => ?
    Sé lo que significan; trató de la sintaxis que se publicaron realmente? IF 1=<2 PRINT 'um'; rendimientos Msg 102, Level 15, State 1, Line 1 Incorrect syntax near '<'.
    por favor, mire MUY de CERCA en el código que has publicado. =< es NO de la misma como <=!
    ¡Vaya! Gracias por la captura. (Se fija. Me quitaron mis comentarios anteriores.)

    OriginalEl autor David Manheim

  5. 0

    @Andomar muchas Gracias, me ayudaste, no es mi complemento por encima de su código.

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

    OriginalEl autor af456a4

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *