數(shù)據(jù)庫(kù)之SQL技巧整理案例
一、獲得給定月份的周日數(shù)
根據(jù)給定的某個(gè)日期,計(jì)算這個(gè)月份的周日的天數(shù)。
根據(jù)系統(tǒng)變量@@DATEFIRST的值,判斷周日的序號(hào)為【DatePart(WEEKDAY,RQ)= (07-@@DateFirst) % 7 + 1】。下面列出了周日、周一…周六的公式
| 公式 | 周幾 |
|---|---|
| (7-@@DateFirst)%7 +1 | 周日 |
| (7-@@DateFirst)%7 +2 | 周一 |
| (7-@@DateFirst)%7 +3 | 周二 |
| (7-@@DateFirst)%7 +4 | 周三 |
| (7-@@DateFirst)%7 +5 | 周四 |
| (7-@@DateFirst)%7 +6 | 周五 |
| (7-@@DateFirst)%7 +7 | 周六 |
下面是獲得周日的SQL語(yǔ)句,SQL語(yǔ)句采用了嵌套循環(huán)的方式來(lái)獲取數(shù)據(jù)
DECLARE @Day SmallDateTime
SET @Day = DateAdd(MM, DateDiff(MM,0,'2019-11-21'), 0)
;WITH Temp AS
( SELECT @Day AS RQ UNION ALL
SELECT RQ+1
FROM TEMP WHERE DateDiff(Month,RQ+1,@Day) = 0
)
SELECT
RN = Row_Number() Over(ORDER BY RQ),
RQ
FROM Temp WHERE DatePart(WEEKDAY,RQ)= (07-@@DateFirst) % 7 + 1
其中:
【DateAdd(MM, DateDiff(MM,0,‘2019-08-21'), 0)】是獲取當(dāng)月第一天的通常做法
運(yùn)行結(jié)果如下:
+---+---------------------+
|RN | RQ |
|---+---------------------|
| 1 | 2019-08-04 00:00:00 |
| 2 | 2019-08-11 00:00:00 |
| 3 | 2019-08-18 00:00:00 |
| 4 | 2019-08-25 00:00:00 |
+---+---------------------+
二、獲得給定月份的所有天的日期
其中:
【DateDiff(Month,fDay+1,@RQ) = 0】是判斷月份相等的通常做法
DECLARE @RQ SMALLDATETIME
SET @RQ = '2019-09-01';
;WITH
tAppDays (fDay) AS
(
SELECT @RQ AS fDay
UNION ALL
SELECT fDay + 1 FROM tAppDays WHERE DateDiff(Month,fDay+1,@RQ) = 0
)
SELECT * FROM tAppDays ORDER BY fDAY
下面是運(yùn)行結(jié)果
fDay
---------------------
2019-09-01 00:00:00
2019-09-02 00:00:00
2019-09-03 00:00:00
...
2019-09-23 00:00:00
2019-09-24 00:00:00
2019-09-25 00:00:00
2019-09-26 00:00:00
2019-09-27 00:00:00
2019-09-28 00:00:00
2019-09-29 00:00:00
2019-09-30 00:00:00
三、獲得子字符串列表
利用遞歸來(lái)獲得給定字符串的SPLIT方法
-- 利用遞歸來(lái)獲得給定字符串的SPLIT方法 DECLARE @CommentStr NVARCHAR(4000)='總經(jīng)理室|銷(xiāo)售部|會(huì)計(jì)部|人事部|工會(huì)|后勤部|生產(chǎn)計(jì)劃部|動(dòng)力分廠|質(zhì)量檢驗(yàn)部|運(yùn)輸部' DECLARE @Split NVARCHAR(1)='|'; WITH Temp AS ( SELECT 1 AS Num UNION ALL SELECT Num + 1 FROM TEMP WHERE Num<Len(@CommentStr) ) SELECT RN = Row_Number() Over(ORDER BY Num), SplitStr = SUBSTRING(@CommentStr,Num,CHARINDEX(@Split,@CommentStr+@Split,Num)-Num) FROM Temp WHERE SUBSTRING(@Split+@CommentStr,Num,1) = @Split OPTION(MAXRECURSION 0);
下面是運(yùn)行效果
RN SplitStr
------------------------
1 總經(jīng)理室
2 銷(xiāo)售部
3 會(huì)計(jì)部
4 人事部
5 工會(huì)
6 后勤部
7 生產(chǎn)計(jì)劃部
8 動(dòng)力分廠
9 質(zhì)量檢驗(yàn)部
10 運(yùn)輸部
------------------------
給定一個(gè)帶有分隔符的字符串,通過(guò)這個(gè)語(yǔ)句獲得各個(gè)字段的列表。
--================================================================================================
-- pAppGetSplit '|','科目名稱(chēng)|身份證號(hào)|學(xué)員姓名|教練編號(hào)|教練姓名|培訓(xùn)次數(shù)|合計(jì)次數(shù)|負(fù)責(zé)比例'
================================================================================================
IF EXISTS (SELECT name FROM sysobjects WHERE name = 'pAppGetSplit' AND type = 'P')
DROP PROCEDURE pAppGetSplit
GO
CREATE PROCEDURE pAppGetSplit
@Split VARCHAR(1),
@STR NVARCHAR(4000)
AS
;WITH Temp AS -- 根據(jù)分隔符|獲得字段列表
( SELECT 1 AS Num UNION ALL
SELECT Num + 1
FROM TEMP WHERE Num<Len(@STR) )
SELECT
RN = Row_Number() Over(ORDER BY Num),
SplitStr = SUBSTRING(@STR,Num,CHARINDEX(@Split,@STR+@Split,Num)-Num)
FROM Temp WHERE SUBSTRING(@Split+@STR,Num,1) = @Split OPTION(MAXRECURSION 0);
GO
下面是運(yùn)行效果
+---+---------------------+
|RN | SplitStr |
|----+---------------------|
| 1 | 科目名稱(chēng) |
| 2 | 身份證號(hào) |
| 3 | 學(xué)員姓名 |
| 4 | 教練編號(hào) |
| 5 | 教練姓名 |
| 6 | 培訓(xùn)次數(shù) |
| 7 | 合計(jì)次數(shù) |
| 8 | 負(fù)責(zé)比例 |
+---+---------------------+
四、獲得本周指定周幾的日期
根據(jù)指定獲得的周幾,得到日期
--獲得本周周一的日期 DECLARE @Z SMALLINT -- [1,2,3,4,5,6,7]分別代表[周一,周二,周三,周四,周五,周六,周日] SET @Z=1 SELECT GetDate() 今天, DATEPART(Weekday,GetDate()) 今天序號(hào), (DATEPART(Weekday,GetDate()) + @@DATEFIRST-1)%7 今天是周幾, DATEADD(Day,@Z-(DATEPART(Weekday,GetDate()) + @@DATEFIRST-1)%7,GetDate()) 本周周一
到此這篇關(guān)于數(shù)據(jù)庫(kù)之SQL技巧整理案例的文章就介紹到這了,更多相關(guān)SQL技巧內(nèi)容請(qǐng)搜索本站以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持本站!
版權(quán)聲明:本站文章來(lái)源標(biāo)注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請(qǐng)保持原文完整并注明來(lái)源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非maisonbaluchon.cn所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來(lái)源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來(lái),僅供學(xué)習(xí)參考,不代表本站立場(chǎng),如有內(nèi)容涉嫌侵權(quán),請(qǐng)聯(lián)系alex-e#qq.com處理。
關(guān)注官方微信