国产精品夜色视频一级区_hh99m福利毛片_国产一区二区成人久久免费影院_伊人久久大香线蕉综合影院75_国产精品久久果冻传媒

您的位置:首頁 >聚焦 >

如何用SQL生成一張日期維度表?_熱點聚焦

2022-11-22 06:36:32    來源:程序員客棧

點擊關注公眾號,SQL干貨及時獲取

后臺回復:1024,獲取海量學習資源

問題描述


(資料圖)

輸入想要生成日歷的年份,通過調用存儲過程,即可生成該年的全部日歷。

創(chuàng)建表結構

我們根據(jù)常見的日歷表來創(chuàng)建一個含有年,月,日,星期的日歷表,具體表結構如下:

CREATE TABLE CALENDAR_INFO ( COUNTRY VARCHAR(5),--"國家" CDR_CODE VARCHAR(5) ,--"日歷代碼" DATE_NAME VARCHAR(20) ,--"日期名稱" YEAR CHAR(4),--"年" MONTH CHAR(2),--"月" WEEK CHAR(6),--"星期" DAY CHAR(2),--"日" CDR_DATE CHAR(10),--"日歷日期" CREATOR VARCHAR(32),--"創(chuàng)建人" CREATE_DATE DATETIME ,--"創(chuàng)建日期" CREATE_INST VARCHAR(20),--"創(chuàng)建機構" DEL_FLAG CHAR(1) DEFAULT 0 ,--"刪除標志" 0:不刪除,1:已刪除 TS DATETIME DEFAULT GETDATE()--"時間戳" )

(提示:代碼可以左右滑動)

上面的表結構中我們將年、月、星期、日等都按照日歷的形式顯示成單獨的列,末尾還添加了兩個默認值,一個是刪除標志,默認為0表示不刪除,1表示刪除,時間戳取系統(tǒng)時間。

創(chuàng)建存儲過程

要調用參數(shù),一般使用存儲過程來傳參。下面我們根據(jù)需求創(chuàng)建一個存儲過程。

我們傳遞進一個INT型的參數(shù)給存儲過程,表示年份,然后取這一年有多少天,從1月1日循環(huán)累加到12月31日,并將每天的相關信息都插入到表中,這樣一整年的完整日歷就完成了。

下面我們在SQL Server環(huán)境下開始寫這個存儲過程吧。

CREATE PROC PROC_CALENDAR(@YEAR INT )ASBEGINDECLARE @i INT;DECLARE @START_DATE VARCHAR(20);DECLARE @END_DATE VARCHAR(20);DECLARE @DATE_COUNT INT; SET @i=0; --定義一年的開始日期,用CONCAT函數(shù)將年份和月份日期拼接起來 SET @START_DATE= CONCAT(@YEAR, "-01-01"); --定義一年的結束日期 SET @END_DATE = CONCAT(@YEAR+1,"-01-01"); --如果表已經存在要新建的日歷,則先刪除 DELETE FROM CALENDAR_INFO WHERE YEAR = @YEAR; --計算開始到結束日期一共有多少天,DATEDIFF函數(shù)計算日期的間隔天數(shù) SET @DATE_COUNT = DATEDIFF(DAY,@START_DATE,@END_DATE); --建立循環(huán),條件是@i小于一年的天數(shù) WHILE @i < @DATE_COUNT BEGIN INSERT INTO CALENDAR_INFO (COUNTRY,CDR_CODE,DATE_NAME, YEAR,MONTH,WEEK,DAY,CDR_DATE,CREATOR,CREATE_DATE,CREATE_INST) SELECT "CN", "CN01", --CONVERT函數(shù)將@START_DATE轉換成指定的格式 CONVERT(CHAR(10),@START_DATE,111) DATE_NAME, --DATENAME獲取@START_DATE的年份 CONVERT(CHAR(4),DATENAME(YEAR, @START_DATE)) YEAR, --DATENAME獲取@START_DATE的月份 CONVERT(CHAR(2),DATENAME(MONTH, @START_DATE)) MONTH, --DATENAME獲取@START_DATE的星期 CONVERT(CHAR(6),DATENAME(WEEKDAY, @START_DATE)) WEEK, --DATENAME獲取@START_DATE的日期 CONVERT(CHAR(2),DATENAME(DAY, @START_DATE)) DAY, CONVERT(CHAR(10),@START_DATE,120) CDR_DATE, "平凡世界", GETDATE() CREATE_DATE, "Lyven" --插入完成后,對@i進行自加1處理 SET @i=@i+1; --更新@START_DATE的值,在原來的基礎上使用DATEADD函數(shù)增加一天 SET @START_DATE=CONVERT(CHAR(10),DATEADD(DAY, 1, @START_DATE),120); END END

為了方便閱讀,已經在每行代碼上方添加了注釋。對SQL系統(tǒng)函數(shù)不熟悉的可以搜索一下相關函數(shù)的用法。

調用存儲過程

EXEC PROC_CALENDAR 2021

驗證結果

執(zhí)行完后我們查詢一下表CALENDAR_INFO里的數(shù)據(jù)

SELECT * FROM CALENDAR_INFO

結果:

翻一下日歷表,2021-01-01這一天是星期五,說明我們寫的日歷表是正確的。

細心的朋友不知有沒有發(fā)現(xiàn),日歷表中缺少中國農歷,感興趣的小伙伴可以思考一下該如何寫農歷的部分。

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

有需要的讀者可以下載學習,在下面的公眾號「數(shù)據(jù)前線」(非本號)后臺回復關鍵字:SQL,就行

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

——End——

后臺回復關鍵字:1024,獲取一份精心整理的技術干貨

后臺回復關鍵字:進群,帶你進入高手如云的交流群。

推薦閱讀

SQL 中為什么經常要加NOLOCK?SQL 語句中 where 條件后 寫上1=1 是什么意思干掉visio,這個畫圖神器真的絕了?。。QL中的高級日期函數(shù)SQL常用腳本整理

關鍵詞: 存儲過程 下面我們 刪除標志

相關閱讀