【问题标题】:Convert Time In sql在sql中转换时间
【发布时间】:2013-11-07 19:57:14
【问题描述】:

嗨,在我的表中,我有 3 列(名称 - 从 - 到)
和数据类型时间(7)
我插入 3 班
shift1 从 08:00:00 到 15:00:00
shift2 从 15:00:00 到 22:00:00
shift3 从 22:00:00 到 08:00:00
我已经创建 SP 来检查现在的转变 这是SP

create PROC SelectShift

AS
DECLARE @TimeNow TIME  =  substring(convert(varchar(20), GetDate(), 9), 13, 5) 
+ ' ' + substring(convert(varchar(30), GetDate(), 9), 25, 2)

SELECT s.Shift_Name, s.Id FROM Schedule s
WHERE @TimeNow BETWEEN s.ShiftTime_From AND s.ShiftTime_To


它在 1 、 2 班工作正常
但在班次 3 中它选择 null(现在时间 22:55:00.0000000)
我以前不使用sql时间,你能帮忙

【问题讨论】:

    标签: sql-server tsql datetime stored-procedures time


    【解决方案1】:

    您得到的结果是正确的,因为时间变量无法确定班次的开始是前一天(即 00:00:00 之前)还是之后。

    您可以使用以下方法解决此问题,但它的编码非常难看。

    DECLARE @TimeNow TIME  = '22:55:00.0000000'
    
    -- substring(convert(varchar(20), GetDate(), 9), 13, 5) 
    --+ ' ' + substring(convert(varchar(30), GetDate(), 9), 25, 2)
    
    
    SELECT s.Shift_Name FROM #Schedule s
    WHERE @TimeNow BETWEEN s.ShiftTime_From AND (CASE WHEN s.ShiftTime_From > s.ShiftTime_To THEN '23:59:59' ELSE s.ShiftTime_To END)
    

    【讨论】:

      【解决方案2】:

      我的第一个想法是将每个间隔从 00:00:00 开始考虑,并将当前时间移动相同的量,但不支持减去时间。所以我最终使用了两个案例。

      这可能是一个表值函数而不是一个 proc,这可能会使编写它更容易:

      Create Proc ShiftForTime @time time as
      Select 
          *
      From
          schedule
      Where (
              ShiftTime_From < ShiftTime_To and
              @time >= ShiftTime_From and
              @time < ShiftTime_To
          ) or (
              ShiftTime_From > ShiftTime_To and (
                  @time >= ShiftTime_From or
                  @time < ShiftTime_To
              )
          )
      Go
      Create Proc SelectShift As
      Declare @now time = getdate()
      Exec ShiftForTime @now
      

      这是一个使用表值函数的示例,其中包含一系列不同的测试:

      Example SQLFiddle

      出于求知欲,我的第一个想法可以发挥作用,尽管它可能效率较低

      Create Proc ShiftForTime2 @time time  as
      Select 
          *
      From
          schedule
      Where
          dateadd(second, datediff(second, ShiftTime_From, 0), @time) 
            < dateadd(second, datediff(second, ShiftTime_From, 0), ShiftTime_To)
      

      【讨论】:

      • 谢谢我现在就试试
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-16
      • 2019-10-03
      • 1970-01-01
      • 2013-12-07
      相关资源
      最近更新 更多