数据库之SQL技巧整理案例

作者:彖爻之辞 时间:2024-01-26 00:46:27 

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

根据给定的某个日期,计算这个月份的周日的天数。
根据系统变量@@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<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);

下面是运行效果

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),
 @STR               NVARCHAR(4000)
AS
 ;WITH Temp AS     -- 根据分隔符|获得字段列表
 (  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

下面是运行效果

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

|RN |  SplitStr           |

|----+---------------------|

| 1 |  科目名称           |

| 2 |  身份证号           |

| 3 |  学员姓名           |

| 4 |  教练编号           |

| 5 |  教练姓名           |

| 6 |  培训次数           |

| 7 |  合计次数           |

| 8 |  负责比例           |

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

四、获得本周指定周几的日期

根据指定获得的周几,得到日期


--获得本周周一的日期
DECLARE @Z SMALLINT
-- [1,2,3,4,5,6,7]分别代表[周一,周二,周三,周四,周五,周六,周日]
SET @Z=1
SELECT
 GetDate() 今天,
 DATEPART(Weekday,GetDate()) 今天序号,
 (DATEPART(Weekday,GetDate()) + @@DATEFIRST-1)%7 今天是周几,
 DATEADD(Day,@Z-(DATEPART(Weekday,GetDate()) + @@DATEFIRST-1)%7,GetDate()) 本周周一

来源:https://blog.csdn.net/paul50060049/article/details/102638224

标签:数据库,SQL,技巧
0
投稿

猜你喜欢

  • 简单谈谈MySQL的半同步复制

    2024-01-15 01:04:50
  • 最新CSS兼容方案

    2008-08-13 13:20:00
  • 十一个案例带你吃透Python函数参数

    2021-07-02 08:11:12
  • 关于HTML5的data-*自定义属性的总结

    2024-04-19 10:17:50
  • Python可视化神器pyecharts绘制漏斗图

    2023-01-09 08:40:09
  • 微信小程序radio组件使用详解

    2024-04-19 10:41:44
  • python matplotlib工具栏源码探析二之添加、删除内置工具项的案例

    2022-05-16 19:31:22
  • mysql-8.0.15-winx64 使用zip包进行安装及服务启动后立即关闭问题

    2024-01-23 05:58:37
  • django的auth认证,authenticate和装饰器功能详解

    2021-10-06 00:34:51
  • python代码区分大小写吗

    2023-11-26 11:23:46
  • JavaScript监听和禁用浏览器回车事件实例

    2023-10-12 01:58:16
  • Java通过数据库表生成实体类详细过程

    2024-01-23 15:39:06
  • Python把图片转化为pdf代码实例

    2021-04-05 19:06:36
  • Golang验证器之validator是使用详解

    2024-01-29 23:40:28
  • 基于JS实现动态跟随特效的示例代码

    2023-06-30 11:15:16
  • Jaspersoft Studio添加mysql数据库配置步骤

    2024-01-17 01:13:26
  • python使用os模块的os.walk遍历文件夹示例

    2021-05-21 12:30:07
  • python开发游戏的前期准备

    2022-01-06 12:58:01
  • OpenCV中resize函数插值算法的实现过程(五种)

    2021-07-09 21:05:24
  • python中re.findall函数实例用法

    2021-03-28 07:51:20
  • asp之家 网络编程 m.aspxhome.com