<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          巧用spt_values解決SQL中的連續(xù)日期問題

          共 1046字,需瀏覽 3分鐘

           ·

          2021-01-09 15:52

          點(diǎn)擊關(guān)注上方“SQL數(shù)據(jù)庫開發(fā)”,

          設(shè)為“置頂或星標(biāo)”,第一時(shí)間送達(dá)干貨

          spt_values是什么

          spt_values是SQL Server新增的一個(gè)系統(tǒng)表,表里面都是一些枚舉數(shù)據(jù)。我們可以通過如下查詢語句來查看里面的數(shù)據(jù)


          select?* from?master..spt_values

          (因?yàn)樵摫韺儆谙到y(tǒng)數(shù)據(jù)庫master下面,所以通常在表名前面添加庫名master)
          結(jié)果為:
          (記錄較多,只截取部分記錄)

          spt_values連續(xù)記錄
          但是通常我們使用的是Type='P'的數(shù)據(jù)記錄,這些記錄是一組從0開始,2047為止的連續(xù)整數(shù),具體如下:

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

          結(jié)果為:
          (記錄較多,只截取部分記錄)

          我們經(jīng)常使用的就是number列,通過該列我們可以生成很多連續(xù)的記錄,包括連續(xù)的日期,例如每天的24小時(shí),每個(gè)月的每天,每年的12個(gè)月等等。

          生成每天的24小時(shí)
          我們只需要指定開始和結(jié)束時(shí)間,就可以生成該時(shí)間段的連續(xù)小時(shí)了,這里從0點(diǎn)到23點(diǎn)。
          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
          (提示:可以左右滑動(dòng)代碼)
          結(jié)果為:
          (完整的有24條記錄,這里只截取前幾條)

          生成每月的每天
          我們只需要指定開始和結(jié)束日期,就可以生成該日期段的連續(xù)天了,這里從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')

          結(jié)果為:
          (完整的有31條記錄,這里只截取前幾條)

          生成每年的每月
          我們只需要指定開始和結(jié)束月份,就可以生成該月份段的連續(xù)月了,這里從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')

          結(jié)果為:

          spt_values應(yīng)用實(shí)例
          有如下一張表Test

          要求:顯示1月份所有日期的DataValue值,如果沒有值的,就顯示為0。

          分析:我們數(shù)據(jù)庫中只存儲(chǔ)了4條數(shù)據(jù),這時(shí)候我們可以利用SQL的表spt_values來實(shí)現(xiàn)。

          解法:

          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;

          結(jié)果為:

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

          以上就是spt_values的一些用法,當(dāng)然它不止在連續(xù)日期上的應(yīng)用,只要是連續(xù)數(shù)字的問題,均可關(guān)聯(lián)spt_values來解決。

          我是岳哥,最后給大家分享我寫的SQL兩件套:《SQL基礎(chǔ)知識(shí)第二版》《SQL高級(jí)知識(shí)第二版》的PDF電子版。里面有各個(gè)語法的解釋、大量的實(shí)例講解和批注等等,非常通俗易懂,方便大家跟著一起來實(shí)操。


          有需要的讀者可以下載學(xué)習(xí),在下面的公眾號(hào)「數(shù)據(jù)前線」(非本號(hào))后臺(tái)回復(fù)關(guān)鍵字:SQL,就行

          數(shù)據(jù)前線
          ——End——

          后臺(tái)回復(fù)關(guān)鍵字:1024,獲取一份精心整理的技術(shù)干貨

          后臺(tái)回復(fù)關(guān)鍵字:進(jìn)群,帶你進(jìn)入高手如云的交流群。

          推薦閱讀

          瀏覽 82
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  色综合天天干 | 伊人精品综合 | A片在线观看网站 | a黄色免费| 日本三级黄色片直播 |