首页 > 数据库 >巧用spt_values解决SQL中的连续日期问题

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

时间:2023-04-03 14:33:17浏览次数:36  
标签:01 spt number values 2021 SQL master

spt_values是什么

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

select * from master..spt_values

 spt_values连续记录

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

select * from master..spt_values where type='P'

 我们经常使用的就是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 
WHERE TYPE = 'P' 
AND DATEDIFF(HH,DATEADD(HH,number,
CONCAT('2021-01-05',' ', '00:00')),
CONCAT('2021-01-05',' ', '23:00'))>=0

 生成每月的每天

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

SELECT 
  CONVERT(NVARCHAR(10), DATEADD(DAY, number, '2021-01-01'),120) AS GroupDay
FROM 
  master..spt_values 
WHERE TYPE = 'P' 
 AND number <= DATEDIFF(DAY, '2021-01-01', '2021-01-31')

生成每年的每月

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

spt_values应用实例

有如下一张表Test

要求:显示1月份所有日期的DataValue值,如果没有值的,就显示为0。

分析:我们数据库中只存储了4条数据,这时候我们可以利用SQL的表spt_values来实现。

SELECT DATEADD(DAY, number, CONVERT(DATETIME, '2021-01-01')) [DataTime],
       ISNULL(DataValue,0) DataValue
FROM master..spt_values
    LEFT JOIN Test
        ON DATEADD(DAY, number, CONVERT(DATETIME, '2021-01-01')) = [DataTime]
WHERE type = 'P'
      AND number
      BETWEEN 0 AND DATEDIFF(DAY, '2021-01-01', DATEADD(MONTH, 1, '2021-01-01'))-1;

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

标签:01,spt,number,values,2021,SQL,master
From: https://www.cnblogs.com/lgx5/p/17282970.html

相关文章

  • MySQL(免安装版)下载,安装,配置环境变量【0基础小白用】
    安装版和免安装版的区别:1.安装版自动帮你配置完成,也有安装引导,上来就能用。2.免安装版可在你自己需要的目录中解压,然后手动配置my.ini,配置环境变量,初始化数据库,配置账号密码,比较灵活,但是新人配置需要查看教程。1,下载https://dev.mysql.com/downloads/mysql/注意有32位和64位......
  • Mysql学习笔记
    1.查看所有数据库showdatabases2.创建数据库createdatabase数据库名3.选择数据库use数据库名4.查看当前数据库下的所有表showtables5.查看表的创建结构,包括创建语句,表的字符集等showcreatetable表名......
  • mysql/mariadb配置详解
    环境说明mariadb版本:mariadb-10.4配置文件参数解读[mysqld]#服务端基本配置port=3306#监听端口user=mysqlpid-file=/var/run/mysqld/mysqld.pid#pid所在的目录socket=/var/run/mysqld/mysqld.sock#为mysql客户端程序和服务器之间的本地通......
  • sql 单号编码规则
    --SETQUOTED_IDENTIFIERON|OFF--SETANSI_NULLSON|OFF--GO/*Description:单号编码规则@key:开头字符串@datelen:日期长度2:年的后两位4:年6:年月8:年月日@numlen:流水号长度例如0:14:0001@spacer:默认空*/ALTERPROCPro_realtime_GetMaxBillNo(@keyNVARCH......
  • ORACLE PL/SQL 程序包的创建与应用
    原文地址:https://www.cnblogs.com/huyong/archive/2011/05/26/2057973.html本篇主要内容如下:第七章  程序包的创建和应用7.1  程序包简介7.2  程序包的定义7.3  包的开发步骤7.4  包定义的说明7.5  子程序重载7.6  加密实用程序7.7  删除包7.8  包的......
  • 金典 SQL笔记(2)
    因为在本地笔记上写的markdown编辑器只支持.md格式导入,图片没办法直接导进去.写的多了懒的一张一张图片切图上传;直接整个文章切成图片上传上去了. ......
  • 金典 SQL笔记(3)
    因为在本地笔记上写的.markdown编辑器只支持.md格式导入,图片没办法直接导进去.写的多了懒的一张一张图片切图上传;直接整个文章切成图片上传上去了. ......
  • Microsoft.SqlServer.Management.SqlMgmt.SimpleJobSchedule”上的属性访问器“Schedu
    标题:MicrosoftSQLServerManagementStudio对象“Microsoft.SqlServer.Management.SqlMgmt.SimpleJobSchedule”上的属性访问器“ScheduleRecurrenceAndTimes”发生以下异常:“对象“Microsoft.SqlServer.Management.SqlMgmt.SimpleJobSchedule”上的属性访问器“StartTimeOfD......
  • prometheus-mysql
    wgethttps://github.com/prometheus/prometheus/releases/download/v2.42.0/prometheus-2.42.0.linux-amd64.tar.gznohup./node_exporter&netstat-lnptu|grep9100#启动mysqld_exporternohup./mysqld_exporter--config.my-cnf=./.my.cnf&#确认是否正常启动......
  • sql server 日期格式转换
    举例,日期字符串格式:mm/dd/yy   07/22/17转换日期:selectCONVERT(datetime,'07/22/17',1)输出后:2017-07-2200:00:00.000SQLServer使用科威特算法来支持阿拉伯样式的日期格式不带世纪数位(yy)(1)带世纪数位(yyyy)Standard输入/输出(3)-0或100(1,2)datet......