SQL创建某一年日历表
問題描述
輸入想要生成日歷的年份,通過調用存儲過程,即可生成該年的全部日歷。
創建表結構
我們根據常見的日歷表來創建一個含有年,月,日,星期的日歷表,具體表結構如下:
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),--'創建人'
? ? ? CREATE_DATE DATETIME ,--'創建日期'
? ? ? CREATE_INST VARCHAR(20),--'創建機構'
? ? ? DEL_FLAG CHAR(1) DEFAULT 0 ,--'刪除標志' 0:不刪除,1:已刪除
? ? ? TS DATETIME DEFAULT GETDATE()--'時間戳'
? )
上面的表結構中我們將年、月、星期、日等都按照日歷的形式顯示成單獨的列,末尾還添加了兩個默認值,一個是刪除標志,默認為0表示不刪除,1表示刪除,時間戳取系統時間。
創建存儲過程
要調用參數,一般使用存儲過程來傳參。下面我們根據需求創建一個存儲過程。
我們傳遞進一個INT型的參數給存儲過程,表示年份,然后取這一年有多少天,從1月1日循環累加到12月31日,并將每天的相關信息都插入到表中,這樣一整年的完整日歷就完成了。
下面我們在SQL Server環境下開始寫這個存儲過程吧。
CREATE PROC PROC_CALENDAR(@YEAR INT )
AS
BEGIN
DECLARE @i INT;
DECLARE @START_DATE VARCHAR(20);
DECLARE @END_DATE VARCHAR(20);
DECLARE @DATE_COUNT INT;
?SET @i=0; ?
--定義一年的開始日期,用CONCAT函數將年份和月份日期拼接起來
?SET @START_DATE= CONCAT(@YEAR, '-01-01');
--定義一年的結束日期
?SET @END_DATE = CONCAT(@YEAR+1,'-01-01');
--如果表已經存在要新建的日歷,則先刪除
?DELETE FROM CALENDAR_INFO WHERE YEAR = @YEAR;
--計算開始到結束日期一共有多少天,DATEDIFF函數計算日期的間隔天數
?SET @DATE_COUNT = DATEDIFF(DAY,@START_DATE,@END_DATE);
--建立循環,條件是@i小于一年的天數 ?
?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函數將@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函數增加一天
? ? ?SET @START_DATE=CONVERT(CHAR(10),DATEADD(DAY, 1, @START_DATE),120);
?END
END
為了方便閱讀,已經在每行代碼上方添加了注釋。對SQL系統函數不熟悉的可以搜索一下相關函數的用法。
調用存儲過程
EXEC PROC_CALENDAR 2021
驗證結果
執行完后我們查詢一下表CALENDAR_INFO里的數據
SELECT * FROM CALENDAR_INFO
總結
以上是生活随笔為你收集整理的SQL创建某一年日历表的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 支付渠道接入设计及实现
- 下一篇: Day15 --框架集合 Collec