spt_values是什麼數據庫
spt_values是SQL Server新增的一個系統表,表裏面都是一些枚舉數據。咱們能夠經過以下查詢語句來查看裏面的數據ide
select * from master..spt_values
(由於該表屬於系統數據庫master下面,因此一般在表名前面添加庫名master)
結果爲:
(記錄較多,只截取部分記錄)3d
spt_values連續記錄
可是一般咱們使用的是Type='P'的數據記錄,這些記錄是一組從0開始,2047爲止的連續整數,具體以下:code
select * from master..spt_values where type='P'
結果爲:
(記錄較多,只截取部分記錄)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
(提示:能夠左右滑動代碼)
結果爲:
(完整的有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')
結果爲:
(完整的有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應用實例
有以下一張表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;
結果爲:
(完整的有31條記錄,這裏只截取前幾條)
以上就是spt_values的一些用法,固然它不止在連續日期上的應用,只要是連續數字的問題,都可關聯spt_values來解決。