巧用spt_values解決SQL中的連續日期問題

spt_values是什麼數據庫

spt_values是SQL Server新增的一個系統表,表裏面都是一些枚舉數據。咱們能夠經過以下查詢語句來查看裏面的數據ide

select * from master..spt_values

(由於該表屬於系統數據庫master下面,因此一般在表名前面添加庫名master)
結果爲:
巧用spt_values解決SQL中的連續日期問題
(記錄較多,只截取部分記錄)3d

spt_values連續記錄
可是一般咱們使用的是Type='P'的數據記錄,這些記錄是一組從0開始,2047爲止的連續整數,具體以下:code

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

結果爲:
巧用spt_values解決SQL中的連續日期問題
(記錄較多,只截取部分記錄)blog

咱們常常使用的就是number列,經過該列咱們能夠生成不少連續的記錄,包括連續的日期,例如天天的24小時,每月的天天,每一年的12個月等等。it

生成天天的24小時
咱們只須要指定開始和結束時間,就能夠生成該時間段的連續小時了,這裏從0點到23點。ast

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

(提示:能夠左右滑動代碼)
結果爲:
巧用spt_values解決SQL中的連續日期問題
(完整的有24條記錄,這裏只截取前幾條)class

生成每個月的天天
咱們只須要指定開始和結束日期,就能夠生成該日期段的連續天了,這裏從1月1日到1月31日。select

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')

結果爲:
巧用spt_values解決SQL中的連續日期問題
(完整的有31條記錄,這裏只截取前幾條)im

生成每一年的每個月
咱們只須要指定開始和結束月份,就能夠生成該月份段的連續月了,這裏從1月到12月。

SELECT 
  SUBSTRING(CONVERT(NVARCHAR(10), DATEADD(MONTH, number, '2021-01-01'),120),1,7) AS GroupMonth
FROM 
  master..spt_values
WHERE TYPE = 'P'  
AND number <= DATEDIFF(MONTH, '2021-01-01', '2021-12-01')

結果爲:
巧用spt_values解決SQL中的連續日期問題

spt_values應用實例
有以下一張表Test
巧用spt_values解決SQL中的連續日期問題

要求:顯示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解決SQL中的連續日期問題

(完整的有31條記錄,這裏只截取前幾條)

以上就是spt_values的一些用法,固然它不止在連續日期上的應用,只要是連續數字的問題,都可關聯spt_values來解決。

相關文章
相關標籤/搜索