【问题标题】:Getting 30 minute slots between time在时间之间获得 30 分钟的时段
【发布时间】:2015-10-28 07:12:00
【问题描述】:

我有一个开始日期时间和一个结束日期时间。

Eg: 10:00 am - 12:00 pm

我必须在两者之间创建 4 个时隙,每个时长 30 分钟。

Eg:  
10:00 am-10:30 am
10:30 am-11:00 am
11:00 am-11:30 am
11:30 am-12:00 pm

这 30 分钟可能会有所不同,而且不是一个常数。我已经尝试了一些东西,但它们似乎不起作用。有人可以帮忙吗。谢谢。

我已经尝试过了,但我只得到插槽差异而不是 slotfrom-slotto

  SELECT 
   from_dt,to_dt,

   DATEDIFF(mi,DATEADD(dd,DATEDIFF(dd,0,from_dt ),0),to_dt )/60 as SlotNumber
FROM
   d
   group by  from_dt,to_dt, DATEDIFF(mi,DATEADD(dd,DATEDIFF(dd,0,from_dt ),0),to_dt )/60 

【问题讨论】:

标签: sql-server time slot


【解决方案1】:

感谢@dwain.c获取Reference

--Declare table
DECLARE @t TABLE
(StartTime TIME, EndTime TIME)
INSERT INTO @t
SELECT '10:00', '12:00'
-- Make CTE
;WITH CTE (n) AS (
    SELECT TOP (SELECT DATEDIFF(MINUTE,StartTime,EndTime)/30
    FROM @t) 30*(ROW_NUMBER() OVER (ORDER BY (SELECT NULL))-1)
    FROM sys.all_columns
    )
-- QUERY
SELECT 
     TSStart=DATEADD(minute, n, StartTime)
    ,TSEnd=DATEADD(minute, n + 30, StartTime)
    ,Timeslot=CONVERT(VARCHAR(100), DATEADD(minute, n, StartTime), 0) + ' - ' +
        CONVERT(VARCHAR(100), DATEADD(minute, n + 30, StartTime), 0)
FROM @t
CROSS APPLY (
    SELECT n 
    FROM CTE 
    WHERE n BETWEEN 0 AND DATEDIFF(minute, StartTime, DATEADD(minute, -30, EndTime))) a
ORDER BY TSStart

【讨论】:

  • 非常感谢@tinka.. 你能否解释一下我如何预订一个插槽,并且它不会出现在可用插槽中。 ?
  • @FahadAshraf 你应该保留一个布尔列 IsBooked 对应于 Slots 如果值为 True 然后记录将不会填充
  • 但因为这是在运行时。我没有在数据库中保存插槽。只有预订的插槽。如果我每天都保存插槽,我会节省很多插槽。
  • @FahadAshraf 我们必须在某个地方跟踪它,否则我们将如何带来数据
  • 我们不能将 from-to 值保存在不同的表中,然后从该查询中排除它吗?喜欢加入他们还是什么?请帮忙。我想我们快到了。 :)
猜你喜欢
  • 2017-03-17
  • 2018-11-07
  • 2021-07-16
  • 1970-01-01
  • 2014-06-11
  • 2016-09-27
  • 1970-01-01
  • 1970-01-01
  • 2019-10-24
相关资源
最近更新 更多