巧用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来解决。


相关文章
|
11月前
|
SQL BI 数据库
达梦(DM) SQL日期操作及分析函数
讲述DM 数据库中如何实现各种日期相关的运算以及如何利用分析函数 lead() over() 进行范围问题的处理
|
11月前
|
SQL Serverless 数据库
|
3月前
|
SQL 数据处理
SQL 能力问题之合并两个存在交叉的日期区间,如何解决
SQL 能力问题之合并两个存在交叉的日期区间,如何解决
|
5月前
|
SQL HIVE
【Hive SQL 每日一题】统计用户连续下单的日期区间
该SQL代码用于统计用户连续下单的日期区间。首先按`user_id`和`order_date`分组并去除重复,然后使用`row_number()`标记行号,并通过`date_sub`与行号计算潜在的连续日期。接着按用户ID和计算后的日期分组,排除连续订单数少于2的情况,最后提取连续下单的起始和结束日期。输出结果展示了用户连续下单的日期范围。
|
5月前
|
SQL 索引
SQL日期函数
SQL日期函数
59 0
|
5月前
|
SQL 关系型数据库 MySQL
sql查询指定日期前n天数据
sql查询指定日期前n天数据
|
SQL
SQL技巧:构建一个包含过去30天日期的虚拟表
SQL技巧:构建一个包含过去30天日期的虚拟表
127 0
|
5月前
|
SQL 自然语言处理 数据挖掘
「SQL面试题库」 No_115 按日期分组销售产品
「SQL面试题库」 No_115 按日期分组销售产品
|
5月前
|
SQL 开发框架 安全
SQL 日期处理和视图创建:常见数据类型、示例查询和防范 SQL 注入方法
在数据库操作中,处理日期是一个关键的方面。确保插入的日期格式与数据库中日期列的格式匹配至关重要。以下是一些常见的SQL日期数据类型和处理方法。
175 8
|
5月前
|
SQL
leetcode-SQL-1164. 指定日期的产品价格
leetcode-SQL-1164. 指定日期的产品价格
36 0