数据库之SQL技巧整理案例

这篇文章主要介绍了数据库之SQL技巧整理案例,本篇文章通过整合了多种场景下的简要案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下

一、获得给定月份的周日数

根据给定的某个日期,计算这个月份的周日的天数。
根据系统变量@@DATEFIRST的值,判断周日的序号为【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语句,SQL语句采用了嵌套循环的方式来获取数据

 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)】是获取当月第一天的通常做法
运行结果如下:

+---+---------------------+

|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

下面是运行结果

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

三、获得子字符串列表

利用递归来获得给定字符串的SPLIT方法

 -- 利用递归来获得给定字符串的SPLIT方法 DECLARE @CommentStr NVARCHAR(4000)='总经理室|销售部|会计部|人事部|工会|后勤部|生产计划部|动力分厂|质量检验部|运输部' DECLARE @Split     NVARCHAR(1)='|'; WITH Temp AS (  SELECT 1 AS Num UNION ALL SELECT Num + 1 FROM TEMP WHERE Num

下面是运行效果

RN  SplitStr

------------------------

 1  总经理室

 2  销售部

 3  会计部

 4  人事部

 5  工会

 6  后勤部

 7  生产计划部

 8  动力分厂

 9  质量检验部

10  运输部

------------------------

给定一个带有分隔符的字符串,通过这个语句获得各个字段的列表。

 --================================================================================================ --   pAppGetSplit '|','科目名称|身份证号|学员姓名|教练编号|教练姓名|培训次数|合计次数|负责比例' ================================================================================================ IF EXISTS (SELECT name FROM sysobjects WHERE name = 'pAppGetSplit' AND type = 'P') DROP PROCEDURE pAppGetSplit GO CREATE PROCEDURE pAppGetSplit @Split             VARCHAR(1), @ST

以上就是数据库之SQL技巧整理案例的详细内容,更多请关注0133技术站其它相关文章!

赞(0) 打赏
未经允许不得转载:0133技术站首页 » 数据库