SQL 时间段交集

1.创建表

CREATE TABLE [dbo].[DateTimeTest](

[Id] [bigint] IDENTITY(1,1) NOT NULL,
[TimeStart] [datetime] NULL,
[TimeEnd] [datetime] NULL

) ON [PRIMARY]

2.插入数据

USE [MyTest]
GO
/****** Object:  Table [dbo].[DateTimeTest]    Script Date: 11/01/2017 14:37:02 ******/
SET IDENTITY_INSERT [dbo].[DateTimeTest] ON
INSERT [dbo].[DateTimeTest] ([Id], [TimeStart], [TimeEnd]) VALUES (1, CAST(0x0000A81700FF8BEC AS DateTime), CAST(0x0000A817014176EC AS DateTime))
INSERT [dbo].[DateTimeTest] ([Id], [TimeStart], [TimeEnd]) VALUES (2, CAST(0x0000A81700EF112C AS DateTime), CAST(0x0000A81700FF8BEC AS DateTime))
INSERT [dbo].[DateTimeTest] ([Id], [TimeStart], [TimeEnd]) VALUES (3, CAST(0x0000A817005AC06C AS DateTime), CAST(0x0000A81700FF8BEC AS DateTime))
INSERT [dbo].[DateTimeTest] ([Id], [TimeStart], [TimeEnd]) VALUES (4, CAST(0x0000A817005AC06C AS DateTime), CAST(0x0000A81700BDA0EC AS DateTime))
INSERT [dbo].[DateTimeTest] ([Id], [TimeStart], [TimeEnd]) VALUES (5, CAST(0x0000A817009CAB6C AS DateTime), CAST(0x0000A81700CE1BAC AS DateTime))
INSERT [dbo].[DateTimeTest] ([Id], [TimeStart], [TimeEnd]) VALUES (6, CAST(0x0000A817014176EC AS DateTime), CAST(0x0000A81701626C6C AS DateTime))
INSERT [dbo].[DateTimeTest] ([Id], [TimeStart], [TimeEnd]) VALUES (7, CAST(0x0000A817005AC06C AS DateTime), CAST(0x0000A817007BB5EC AS DateTime))
INSERT [dbo].[DateTimeTest] ([Id], [TimeStart], [TimeEnd]) VALUES (8, CAST(0x0000A817005AC06C AS DateTime), CAST(0x0000A817014176EC AS DateTime))
INSERT [dbo].[DateTimeTest] ([Id], [TimeStart], [TimeEnd]) VALUES (9, CAST(0x0000A817009CAB6C AS DateTime), CAST(0x0000A81701626C6C AS DateTime))
SET IDENTITY_INSERT [dbo].[DateTimeTest] OFF

3.--获取每一天(每一条数据)08:30-14:30中时间段总和

select 
dt.TimeStart,
dt.TimeEnd,
CONVERT(varchar(100), dt.TimeStart, 24)Start,
CONVERT(varchar(100), dt.TimeEnd, 24)[End],
datediff( MINUTE, '08:30:00',CONVERT(varchar(100), dt.TimeStart, 24)) '开始时差',
datediff( MINUTE, '14:30:00',CONVERT(varchar(100), dt.TimeEnd, 24))'结束时差',
case when datediff( MINUTE, '08:30:00',CONVERT(varchar(100), dt.TimeStart, 24))>0 then  CONVERT(varchar(100), dt.TimeStart, 24) else '08:30:00' end '交集开始',
case when datediff( MINUTE, '14:30:00',CONVERT(varchar(100), dt.TimeEnd, 24))<=0 then  CONVERT(varchar(100), dt.TimeEnd, 24) else '14:30:00' end '交集结束',
case when 
   (case when datediff( MINUTE, '08:30:00',CONVERT(varchar(100), dt.TimeStart, 24))>0 then  CONVERT(varchar(100), dt.TimeStart, 24) else '08:30:00' end)
    <
   (case when datediff( MINUTE, '14:30:00',CONVERT(varchar(100), dt.TimeEnd, 24))<=0 then  CONVERT(varchar(100), dt.TimeEnd, 24) else '14:30:00' end)
    then 'true' else 'false' end '是否有交集',
case when  
      (case when
  (case when datediff( MINUTE, '08:30:00',CONVERT(varchar(100), dt.TimeStart, 24))>0 then  CONVERT(varchar(100), dt.TimeStart, 24) else '08:30:00' end)
   <
  (case when datediff( MINUTE, '14:30:00',CONVERT(varchar(100), dt.TimeEnd, 24))<=0 then  CONVERT(varchar(100), dt.TimeEnd, 24) else '14:30:00' end)
      then 'true' else 'false' end )='true'
      then (datediff(MINUTE,       
        (case when datediff( MINUTE, '08:30:00',CONVERT(varchar(100), dt.TimeStart, 24))>0 then  CONVERT(varchar(100), dt.TimeStart, 24) else '08:30:00' end),
         (case when datediff( MINUTE, '14:30:00',CONVERT(varchar(100), dt.TimeEnd, 24))<=0 then  CONVERT(varchar(100), dt.TimeEnd, 24) else '14:30:00' end)
        )      
      ) else 0 end '交集分钟'
       
from DateTimeTest dt

更多信息请查看 个人博客 或者关注公众号:Z技术

SQL Server中,要计算词组交集,可以使用GROUP BY子句来实现。GROUP BY子句用于将结果集按照指定的列进行分组,并对每个分组应用聚合函数。在这种情况下,我们可以使用GROUP BY子句将词组作为列进行分组,并使用聚合函数来计算交集。 在GROUP BY子句中,我们可以使用逗号分隔的列列表或者使用GROUPING SET语法来指定分组。 GROUPING SET语法允许我们指定多个分组集合,从而获得更灵活的分组结果。 另外,如果你想要查看查询的执行计划,可以使用EXPLAIN PLAN语句来生成查询的执行计划。这可以帮助你了解查询的执行方式和优化性能。EXPLAIN PLAN语句可以使用SET STATEMENT_NAME子句来指定一个语句名称,以便于后续引用。 综上所述,在SQL Server中,要计算词组交集,你可以使用GROUP BY子句,并可以使用GROUPING SET语法来指定多个分组集合。如果你想要查看查询的执行计划,可以使用EXPLAIN PLAN语句。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [SAP Hana数据库 sql语法](https://blog.csdn.net/weixin_45987577/article/details/126094151)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [hana SQL函数](https://blog.csdn.net/ycy514070141/article/details/109624104)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值