【问题标题】:How to get range time in sql server如何在sql server中获取范围时间
【发布时间】:2018-02-01 07:03:54
【问题描述】:

基本上我想做的是在范围之间转移

已经搞定了

where @param_value_from_hour between From_Hour and To_Hour

它在 @param_value_from_hour 假设是 16:00 时有效,但如果我必须在 19:00 搜索 @param_value_from_hour 怎么办?

【问题讨论】:

  • 我猜您需要进行某种转换,以使该查询(或类似的查询)起作用...例如将一天添加到“To_Hour”值...或者也许您可以检查此人是否属于班次 1... 如果不是,他肯定属于班次 2 ;)
  • 哦,我忘了提到最大班次是 3,嗯,关于某种转换,我不明白,但我想我会尝试你的想法,即在 to_hour 值上加一天,谢谢您的回复
  • 你的数据总是07:00:00 - 18:00:0018:00:00 - 07:00:00吗?

标签: sql-server sql-server-2008 sql-server-2012


【解决方案1】:

如果逻辑是这样,如果期间的结束早于期间的开始,则假定期间跨越午夜(如果不是,我们需要一些其他形式的约定,否则事情会变得非常模糊):

where
   (@param_value_from_hour between From_Hour and To_Hour) or
   (To_Hour < From_Hour and
       (@param_value_from_hour < To_Hour or
        From_Hour < @param_value_from_hour)
   )

应该得到您想要的大致结果(如果需要,将 &lt; 调整为 &lt;=

【讨论】:

    【解决方案2】:

    将您的 time 列转换为 datetime 并进行比较

    declare @param_value_from_hour varchar(20) = '19:00'
    ;with myTable as (
        select * 
        from (
            values 
                (1, '7:00:00', '18:00:00')
                , (2, '18:00:00', '7:00:00')
        ) t(Shift, From_Hour, To_Hour)
    )
    
    select
        * 
    from
        myTable
    where
        cast('20180101 ' + @param_value_from_hour as datetime) between 
        cast('20180101 ' + From_Hour as datetime) 
        and cast('20180101 ' + To_Hour as datetime) + case when From_Hour < To_Hour then 1 else 0 end
    

    【讨论】:

      【解决方案3】:

      试试这个:

      CREATE TABLE Data (
          Shift INT,
          FromHour TIME,
          ToHour TIME
          );
      
      INSERT INTO Data (Shift, FromHour, ToHour) VALUES
      (1, '07:00:00', '18:00:00'),
      (2, '18:00:00', '07:00:00');
      
      DECLARE @Param TIME= '16:00:00'; --Change that to '19:00:00'
      
      SELECT *
      FROM Data
      WHERE CAST(@Param AS DATETIME) BETWEEN 
            CAST(FromHour AS DATETIME)
              AND
          (CASE 
               WHEN (@Param >= '18:00:00' AND ToHour = '07:00:00') 
                   THEN DATEADD(D, 1, CAST(ToHour AS DATETIME)) 
               ELSE CAST(ToHour AS DATETIME) 
          END)
      

      【讨论】:

        【解决方案4】:

        感谢您的宝贵回复

        所以这是结合 2 个答案的答案

        declare @param_value_from_hour varchar(20) = '19:00'
        
        ;with myTable as (
            select * 
            from (
                values 
                    (1, '07:00:00', '15:00:00')
                    , (2, '15:00:00', '23:00:00')
                    , (3, '23:00:00', '07:00:00')
            ) t(Shift, From_Hour, To_Hour)
        )
        
        select
            * 
        from
            myTable
        where
           (@param_value_from_hour between From_Hour and To_Hour) or
           (To_Hour < From_Hour and
               (@param_value_from_hour < To_Hour or
                From_Hour < @param_value_from_hour)
           )
        

        谢谢你们,你们太棒了!!

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多