SQL Server 中如何做到连续时间段的拆分?

今天在工作中遇到了一个很实际的问题,客户在OA接口的员工休假中间表中提供了连续时间段的休假记录,例如: 张三,2018-12-1 ~2018-12-31 ,病假,31天。这样带来的问题是,如果我需要统计张三从12月1号到12月15号的休假天数,单从这一整条连续记录是无法统计的。这时候就需要我们将一条长记录进行拆分。

这里记录下我自己的思路:

1:利用系统表得到0-2047的序列 ,2048*2048绝对够用了吧

SELECT sv.number AS n FROM MASTER.dbo.spt_values AS sv WHERE sv.[type]=‘P‘

结果如图:

2:利用CROSS APPLY  得到最终序列(从1开始,最后一行是2048*2048)

WITH
 t1 AS (SELECT sv.number AS n FROM MASTER.dbo.spt_values AS sv WHERE sv.[type]=‘P‘),
 t2 AS ( SELECT ROW_NUMBER() OVER (ORDER BY (SELECT 1)) AS rid  FROM t1 AS a CROSS APPLY t1 AS b)
-----------------
SELECT *FROM t2 

结果如图

你千万别告诉我400多万都不够你拆的啊,小心我揍你

3:奉上完整代码

DECLARE @begindate DATE =CAST(‘2017-12-1‘ AS date)
DECLARE @enddate DATE =CAST(‘2017-12-31‘ AS date)
BEGIN 

WITH
 t1 AS (SELECT sv.number AS n FROM MASTER.dbo.spt_values AS sv WHERE sv.[type]=‘P‘),
 t2 AS ( SELECT ROW_NUMBER() OVER (ORDER BY (SELECT 1)) AS rid  FROM t1 AS a CROSS APPLY t1 AS b)
-----------------
--SELECT *FROM t2 

SELECT
DATEADD(DAY,t2.rid-1,@begindate) as date
FROM t2
WHERE t2.rid BETWEEN -1 AND (DATEDIFF(DAY,@begindate,@enddate)+1)
END 

PS:因为序列从1开始,用Dateadd函数我需要从0天开始加起(作为第一天),因此注意下上述代码的-1 和+1的作用。

效果如图:

最后:

  关于With 关键字、row_nunber()over()开窗函数 以及cross apply请您自行脑补学习,以免一知半解

原文地址:https://www.cnblogs.com/randy-fu/p/8715786.html

时间: 2024-10-09 18:39:00

SQL Server 中如何做到连续时间段的拆分?的相关文章

sql server中将一个字段根据某个字符拆分成多个字段显示

sql server 数据库中某张表(Person)的数据信息是: ID Address 1 平山花园-4单元-12幢-203 2 香山花园-3单元-22幢-304 现在有需求是,将地址信息显示形式改成4列 ,即小区名,单元号,楼房号,房间号  分成4列进行显示 ID 小区名 单元号 楼房号 房间号 1 平山花园 4单元 12幢 203 2 香山花园 3单元 22幢 304 介绍两种方案: 第一种:最简单的办法就是调用sql server中自带函数PARSENAME来进行拆分,但是注意:最多只能

SQL Server中关于跟踪(Trace)那点事

前言 一提到跟踪俩字,很多人想到警匪片中的场景,同样在我们的SQL Server数据库中“跟踪”也是无处不在的,如果我们利用好了跟踪技巧,就可以针对某些特定的场景做定向分析,找出充足的证据来破案. 简单的举几个应用场景: 在线生产库为何突然宕机?数百张数据表为何不翼而飞?刚打好补丁的系统为何屡遭黑手?新添加的信息表为何频频丢失?某张表字段的突然更改,究竟为何人所为?这些个匿名的访问背后,究竟是人是鬼?突然增加的增量数据,究竟是对是错?数百兆的日志爆炸式的增长背后又隐藏着什么?这一且的背后,是应用

SQL Server中一个隐性的IO性能杀手-Forwarded record

原文:SQL Server中一个隐性的IO性能杀手-Forwarded record 简介     最近在一个客户那里注意到一个计数器很高(Forwarded Records/Sec),伴随着间歇性的磁盘等待队列的波动.本篇文章分享什么是forwarded record,并从原理上谈一谈为什么Forwarded record会造成额外的IO.   存放原理     在SQL Server中,当数据是以堆的形式存放时,数据是无序的,所有非聚集索引的指针存放指向物理地址的RID.当数据行中的变长列增

Sql Server中通配符

Sql Server中通配符的使用 通配符_ "_"号表示任意单个字符,该符号只能匹配一个字符."_"可以放在查询条件的任意位置,且只能代表一个字符.一个汉字只使用一个"_"表示. 通配符% "%"符号是字符匹配符,能匹配0个或更多字符的任意长度的字符串.在SQL语句中可以在查询条件的任意位置放置一个%来代表一个任意长度的字符串.在查询条件时也可以放置两个%进行查询,但在查询条件中最好不要连续出现两个% 通配符[] 在模式查询

转载: SQL Server中的索引

http://www.blogjava.net/wangdetian168/archive/2011/03/07/347192.html 1 SQL Server中的索引 索引是与表或视图关联的磁盘上结构,可以加快从表或视图中检索行的速度.索引包含由表或视图中的一列或多列生成的键.这些键存储在一个结构(B 树)中,使 SQL Server 可以快速有效地查找与键值关联的行. 表或视图可以包含以下类型的索引: 聚集索引 聚集索引根据数据行的键值在表或视图中排序和存储这些数据行.索引定义中包含聚集索

SQL Server中的锁的简单学习

原文:SQL Server中的锁的简单学习 简介 在SQL Server中,每一个查询都会找到最短路径实现自己的目标.如果数据库只接受一个连接一次只执行一个查询.那么查询当然是要多快好省的完成工作.但对于大多数数据库来说是需要同时处理多个查询的.这些查询并不会像绅士那样排队等待执行,而是会找最短的路径执行.因此,就像十字路口需要一个红绿灯那样,SQL Server也需要一个红绿灯来告诉查询:什么时候走,什么时候不可以走.这个红绿灯就是锁. 图1.查询可不会像绅士们那样按照次序进行排队 为什么需要

T-SQL查询进阶—理解SQL Server中的锁

在SQL Server中,每一个查询都会找到最短路径实现自己的目标.如果数据库只接受一个连接一次只执行一个查询.那么查询当然是要多快好省的完成工作.但对于大多数数据库来说是需要同时处理多个查询的.这些查询并不会像绅士那样排队等待执行,而是会找最短的路径执行.因此,就像十字路口需要一个红绿灯那样,SQL Server也需要一个红绿灯来告诉查询:什么时候走,什么时候不可以走.这个红绿灯就是锁. 图1.查询可不会像绅士们那样按照次序进行排队 为什么需要锁 在开始谈锁之前,首先要简单了解一下事务和事务的

MSSQL之二 Sql Server中管理库与表

作为数据库开发人员,你负责创建和管理数据库和表.当创建表的时候,维护数据的完整性对你是很重要的.为确保表中的数据是准确的,一致的和可靠的,SQL Server提供了各种你可以应用到表上以增强数据完整性的检查. SQL Server包含各种系统数据库.本章介绍不同类型的系统数据库并且解释如何管理用户定义的数据库和管理用户自定义表. 重点 ?      管理数据库 ?      管理表 ?      SQL Server 2008中的数据类型 预习功课 ?        创建数据库 ?       

SQL Server中的索引

1 SQL Server中的索引 索引是与表或视图关联的磁盘上结构,可以加快从表或视图中检索行的速度.索引包含由表或视图中的一列或多列生成的键.这些键存储在一个结构(B 树)中,使 SQL Server 可以快速有效地查找与键值关联的行. 表或视图可以包含以下类型的索引: 聚集索引 聚集索引根据数据行的键值在表或视图中排序和存储这些数据行.索引定义中包含聚集索引列.每个表只能有一个聚集索引,因为数据行本身只能按一个顺序排序. 只有当表包含聚集索引时,表中的数据行才按排序顺序存储.如果表具有聚集索