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

简介: SQL数据库开发

spt_values是什么

spt_values是SQL Server新增的一个系统表,表里面都是一些枚举数据。我们可以通过如下查询语句来查看里面的数据


select * from master..spt_values


(因为该表属于系统数据库master下面,所以通常在表名前面添加库名master)

结果为:

50.jpg                                    (记录较多,只截取部分记录)

spt_values连续记录但是通常我们使用的是Type='P'的数据记录,这些记录是一组从0开始,2047为止的连续整数,具体如下:

select * from master..spt_values wheretype='P'


结果为:

51.jpg

                               (记录较多,只截取部分记录)

我们经常使用的就是number列,通过该列我们可以生成很多连续的记录,包括连续的日期,例如每天的24小时,每个月的每天,每年的12个月等等。

生成每天的24小时我们只需要指定开始和结束时间,就可以生成该时间段的连续小时了,这里从0点到23点。

SELECT

 SUBSTRING(CONVERT(CHAR(32),

 DATEADD(HH,number,CONCAT('2021-01-05',' ', '00:00')),120),1,16) AS GroupDay

FROM

 master..spt_values

WHERETYPE = 'P'

ANDDATEDIFF(HH,DATEADD(HH,number,

CONCAT('2021-01-05',' ', '00:00')),

CONCAT('2021-01-05',' ', '23:00'))>=0

结果为:

                                  52.jpg

                            (完整的有24条记录,这里只截取前几条)


生成每月的每天

我们只需要指定开始和结束日期,就可以生成该日期段的连续天了,这里从1月1日到1月31日。

SELECT

 CONVERT(NVARCHAR(10), DATEADD(DAY, number, '2021-01-01'),120) AS GroupDay

FROM

 master..spt_values

WHERETYPE = 'P'

ANDnumber <= DATEDIFF(DAY, '2021-01-01', '2021-01-31')


结果为:

                                                  53.jpg

                               (完整的有31条记录,这里只截取前几条)


生成每年的每月

我们只需要指定开始和结束月份,就可以生成该月份段的连续月了,这里从1月到12月。

SELECT

 SUBSTRING(CONVERT(NVARCHAR(10), DATEADD(MONTH, number, '2021-01-01'),120),1,7) AS GroupMonth

FROM

 master..spt_values

WHERETYPE = 'P'  

ANDnumber <= DATEDIFF(MONTH, '2021-01-01', '2021-12-01')


结果为:

                                                           54.jpg


spt_values应用实例

有如下一张表Test

55.jpg

要求:显示1月份所有日期的DataValue值,如果没有值的,就显示为0。
分析:我们数据库中只存储了4条数据,这时候我们可以利用SQL的表spt_values来实现。
解法:

SELECTDATEADD(DAY, number, CONVERT(DATETIME, '2021-01-01')) [DataTime],

      ISNULL(DataValue,0) DataValue

FROM master..spt_values

   LEFTJOINTest

       ONDATEADD(DAY, number, CONVERT(DATETIME, '2021-01-01')) = [DataTime]

WHEREtype = 'P'

     ANDnumber

     BETWEEN0ANDDATEDIFF(DAY, '2021-01-01', DATEADD(MONTH, 1, '2021-01-01'))-1;


结果为:

                 56.jpg

                         (完整的有31条记录,这里只截取前几条)

以上就是spt_values的一些用法,当然它不止在连续日期上的应用,只要是连续数字的问题,均可关联spt_values来解决。


相关文章
|
SQL BI 数据库
达梦(DM) SQL日期操作及分析函数
讲述DM 数据库中如何实现各种日期相关的运算以及如何利用分析函数 lead() over() 进行范围问题的处理
|
SQL Serverless 数据库
|
2月前
|
SQL 开发框架 .NET
sql server日期时间函数
sql server日期时间函数
50 2
|
2月前
|
SQL 关系型数据库 MySQL
SQL日期函数
SQL日期函数
|
4月前
|
Java 应用服务中间件 Maven
从零到英雄:一步步构建你的首个 JSF 应用程序,揭开 JavaServer Faces 的神秘面纱
【8月更文挑战第31天】JavaServer Faces (JSF) 是一种强大的 Java EE 标准,用于构建企业级 Web 应用。它提供了丰富的组件库和声明式页面描述语言 Facelets,便于开发者快速开发功能完善且易于维护的 Web 应用。本文将指导你从零开始构建一个简单的 JSF 应用,包括环境搭建、依赖配置、Managed Bean 编写及 Facelets 页面设计。
107 0
|
4月前
|
SQL 关系型数据库 MySQL
【超全整理】SQL日期与时间函数大汇总会:MySQL与SQL Server双轨对比教学,助你轻松搞定时间数据处理难题!
【8月更文挑战第31天】本文介绍了在不同SQL数据库系统(如MySQL、SQL Server、Oracle)中常用的日期与时间函数,包括DATE、NOW()、EXTRACT()、DATE_ADD()、TIMESTAMPDIFF()及日期格式化等,并提供了具体示例。通过对比这些函数在各系统中的使用方法,帮助开发者更高效地处理日期时间数据,满足多种应用场景需求。
552 0
|
5月前
|
SQL 数据处理
SQL 能力问题之合并两个存在交叉的日期区间,如何解决
SQL 能力问题之合并两个存在交叉的日期区间,如何解决
|
7月前
|
SQL HIVE
【Hive SQL 每日一题】统计用户连续下单的日期区间
该SQL代码用于统计用户连续下单的日期区间。首先按`user_id`和`order_date`分组并去除重复,然后使用`row_number()`标记行号,并通过`date_sub`与行号计算潜在的连续日期。接着按用户ID和计算后的日期分组,排除连续订单数少于2的情况,最后提取连续下单的起始和结束日期。输出结果展示了用户连续下单的日期范围。
255 0
|
7月前
|
SQL 索引
SQL日期函数
SQL日期函数
69 0
|
7月前
|
SQL 关系型数据库 MySQL
sql查询指定日期前n天数据
sql查询指定日期前n天数据

热门文章

最新文章