当前位置: 首页 > 科技观察

巧用Spt_Values解决SQL中的连续日期问题

时间:2023-03-21 15:34:48 科技观察

使用Spt_Values解决SQL中连续日期问题转载本文请联系开发者公众号。什么是spt_values?spt_values是SQLServer新建的一个系统表,里面包含了一些枚举的数据。我们可以使用如下查询来查看select*frommaster..spt_values中的数据(因为该表属于系统数据库master,所以通常在表名前加上数据库名master)结果为:(记录很多,只截取部分记录)spt_values连续记录但是通常我们使用Type='P'的数据记录,这些记录是一组从0开始到2047结束的连续整数,如下:select*frommaster..spt_valueswheretype='P'结果为:(记录很多,只截取部分记录)我们经常用到数字列,通过它可以生成很多连续的记录,包括连续的日期,比如一天24小时,每个月的每一天,以及每年的12个月等等。生成一天24小时,我们只需要指定开始和结束时间就可以生成时间段的连续小时数,这里是0:00到23:00。SELECTSUBSTRING(CONVERT(CHAR(32),DATEADD(HH,number,CONCAT('2021-01-05','','00:00')),120),1,16)ASGroupDayFROMmaster..spt_valuesWHERETYPE='P'ANDDATEDIFF(HH,DATEADD(HH,number,CONCAT('2021-01-05','','00:00')),CONCAT('2021-01-05','','23:00'))>=0(提示:可以左右滑动代码)结果为:(共有24条完整记录,这里只截取前几条)要生成每个月的每一天,我们只需要指定开始和结束日期生成日期期间的连续天数,这里是从1月1日到1月31日。SELECTCONVERT(NVARCHAR(10),DATEADD(DAY,number,'2021-01-01'),120)ASGroupDayFROMmaster..spt_valuesWHERETYPE='P'ANDnumber<=DATEDIFF(DAY,'2021-01-01','2021-01-31')结果为:(共有31条完整的记录,这里只截取了前几条)要生成一年中的每个月,我们只需要指定起止月份,就可以生成连续的月段的月份,这里是从一月到十二月。SELECTSUBSTRING(CONVERT(NVARCHAR(10),DATEADD(MONTH,number,'2021-01-01'),120),1,7)ASGroupMonthFROMmaster..spt_valuesWHERETYPE='P'ANDnumber<=DATEDIFF(MONTH,'2021-01-01','2021-12-01')结果为:spt_values应用实例有下表测试需求:显示1月份所有日期的DataValue值,如果没有值则为显示为0。分析:我们的数据库中只存储了4条数据。这时候,我们可以使用SQL表spt_values来实现。解决方案:SELECTDATEADD(DAY,number,CONVERT(DATETIME,'2021-01-01'))[DataTime],ISNULL(DataValue,0)DataValueFROMmaster..spt_valuesLEFTJOINTestONDATEADD(DAY,number,CONVERT(DATETIME,'2021-01-01'))=[DataTime]WHEREtype='P'ANDnumberBETWEEN0ANDDATEDIFF(DAY,'2021-01-01',DATEADD(MONTH,1,'2021-01-01'))-1;结果为:(完整31条记录,这里只截取前几条)以上是spt_values的一些用法,当然不仅仅适用于连续日期,只要连续数的问题都可以解决与spt_values关联。