• 售前

  • 售后

热门帖子
入门百科

数据库之SQL技巧整理案例

[复制链接]
Aim_yuan 显示全部楼层 发表于 2021-8-14 14:33:24 |阅读模式 打印 上一主题 下一主题
一、得到给定月份的周日数

根据给定的某个日期,盘算这个月份的周日的天数。
根据体系变量@@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语句接纳了嵌套循环的方式来获取数据
  1. DECLARE @Day SmallDateTime
  2. SET @Day = DateAdd(MM, DateDiff(MM,0,'2019-11-21'), 0)
  3. ;WITH Temp AS
  4. (  SELECT @Day AS RQ UNION ALL
  5.     SELECT RQ+1
  6.     FROM TEMP WHERE DateDiff(Month,RQ+1,@Day) = 0
  7. )
  8. SELECT
  9.     RN = Row_Number() Over(ORDER BY RQ),
  10.     RQ
  11. FROM Temp WHERE DatePart(WEEKDAY,RQ)= (07-@@DateFirst) % 7 + 1
复制代码
此中:
【DateAdd(MM, DateDiff(MM,0,‘2019-08-21'), 0)】是获取当月第一天的通常做法
运行效果如下:
  1. <span style="background-color: initial;">+---+---------------------+</span>
  2. |RN | RQ                  |
  3. |---+---------------------|
  4. | 1 | 2019-08-04 00:00:00 |
  5. | 2 | 2019-08-11 00:00:00 |
  6. | 3 | 2019-08-18 00:00:00 |
  7. | 4 | 2019-08-25 00:00:00 |
  8. +---+---------------------+
复制代码
二、得到给定月份的全部天的日期

此中:
【DateDiff(Month,fDay+1,@RQ) = 0】是判断月份相当的通常做法
  1. DECLARE @RQ SMALLDATETIME
  2. SET @RQ = '2019-09-01';
  3. ;WITH
  4.   tAppDays (fDay) AS
  5.   (
  6.     SELECT @RQ AS fDay
  7.     UNION ALL
  8.     SELECT fDay + 1 FROM tAppDays WHERE DateDiff(Month,fDay+1,@RQ) = 0
  9.   )
  10. SELECT * FROM tAppDays ORDER BY fDAY
复制代码
下面是运行效果
  1. <span style="background-color: initial;">fDay</span>
  2. ---------------------
  3. 2019-09-01 00:00:00
  4. 2019-09-02 00:00:00
  5. 2019-09-03 00:00:00
  6. ...
  7. 2019-09-23 00:00:00
  8. 2019-09-24 00:00:00
  9. 2019-09-25 00:00:00
  10. 2019-09-26 00:00:00
  11. 2019-09-27 00:00:00
  12. 2019-09-28 00:00:00
  13. 2019-09-29 00:00:00
  14. 2019-09-30 00:00:00
复制代码
三、得到子字符串列表

使用递归来得到给定字符串的SPLIT方法
  1. -- 利用递归来获得给定字符串的SPLIT方法
  2. DECLARE @CommentStr NVARCHAR(4000)='总经理室|销售部|会计部|人事部|工会|后勤部|生产计划部|动力分厂|质量检验部|运输部'
  3. DECLARE @Split     NVARCHAR(1)='|';
  4. WITH Temp AS
  5. (  SELECT 1 AS Num UNION ALL
  6.    SELECT Num + 1
  7.    FROM TEMP WHERE Num<Len(@CommentStr)   )
  8. SELECT
  9.   RN = Row_Number() Over(ORDER BY Num),
  10.   SplitStr = SUBSTRING(@CommentStr,Num,CHARINDEX(@Split,@CommentStr+@Split,Num)-Num)
  11. FROM Temp WHERE SUBSTRING(@Split+@CommentStr,Num,1) = @Split OPTION(MAXRECURSION 0);
复制代码
下面是运行效果
  1. <span style="background-color: initial;">RN  SplitStr</span>
  2. ------------------------
  3.  1  总经理室
  4.  2  销售部
  5.  3  会计部
  6.  4  人事部
  7.  5  工会
  8.  6  后勤部
  9.  7  生产计划部
  10.  8  动力分厂
  11.  9  质量检验部
  12. 10  运输部
  13. ------------------------
复制代码
给定一个带有分隔符的字符串,通过这个语句得到各个字段的列表。
  1. --================================================================================================
  2. --   pAppGetSplit '|','科目名称|身份证号|学员姓名|教练编号|教练姓名|培训次数|合计次数|负责比例'
  3. ================================================================================================
  4. IF EXISTS (SELECT name FROM sysobjects WHERE name = 'pAppGetSplit' AND type = 'P')
  5.    DROP PROCEDURE pAppGetSplit
  6. GO
  7. CREATE PROCEDURE pAppGetSplit
  8.   @Split             VARCHAR(1),
  9.   @STR               NVARCHAR(4000)
  10. AS
  11.   ;WITH Temp AS     -- 根据分隔符|获得字段列表
  12.   (  SELECT 1 AS Num UNION ALL
  13.      SELECT Num + 1
  14.      FROM TEMP WHERE Num<Len(@STR)   )
  15.   SELECT
  16.     RN = Row_Number() Over(ORDER BY Num),
  17.     SplitStr = SUBSTRING(@STR,Num,CHARINDEX(@Split,@STR+@Split,Num)-Num)
  18.   FROM Temp WHERE SUBSTRING(@Split+@STR,Num,1) = @Split OPTION(MAXRECURSION 0);
  19. GO
复制代码
下面是运行效果
  1. <span style="background-color: initial;">+---+---------------------+</span>
  2. |RN |  SplitStr           |
  3. |----+---------------------|
  4. | 1 |  科目名称           |
  5. | 2 |  身份证号           |
  6. | 3 |  学员姓名           |
  7. | 4 |  教练编号           |
  8. | 5 |  教练姓名           |
  9. | 6 |  培训次数           |
  10. | 7 |  合计次数           |
  11. | 8 |  负责比例           |
  12. +---+---------------------+
复制代码
四、得到本周指定周几的日期

根据指定得到的周几,得到日期
  1. --获得本周周一的日期
  2. DECLARE @Z SMALLINT
  3. -- [1,2,3,4,5,6,7]分别代表[周一,周二,周三,周四,周五,周六,周日]
  4. SET @Z=1
  5. SELECT
  6.   GetDate() 今天,
  7.   DATEPART(Weekday,GetDate()) 今天序号,
  8.   (DATEPART(Weekday,GetDate()) + @@DATEFIRST-1)%7 今天是周几,
  9.   DATEADD(Day,@Z-(DATEPART(Weekday,GetDate()) + @@DATEFIRST-1)%7,GetDate()) 本周周一
复制代码
到此这篇关于数据库之SQL本领整理案例的文章就先容到这了,更多相干SQL本领内容请搜索草根技术分享从前的文章或继续浏览下面的相干文章希望各人以后多多支持草根技术分享!

帖子地址: 

回复

使用道具 举报

分享
推广
火星云矿 | 预约S19Pro,享500抵1000!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

草根技术分享(草根吧)是全球知名中文IT技术交流平台,创建于2021年,包含原创博客、精品问答、职业培训、技术社区、资源下载等产品服务,提供原创、优质、完整内容的专业IT技术开发社区。
  • 官方手机版

  • 微信公众号

  • 商务合作