数据库之SQL技巧整理案例


Posted in SQL Server onJuly 07, 2021

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

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

到此这篇关于数据库之SQL技巧整理案例的文章就介绍到这了,更多相关SQL技巧内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

SQL Server 相关文章推荐
SQL Server——索引+基于单表的数据插入与简单查询【1】
Apr 05 SQL Server
SQL Server 数据库实验课第五周——常用查询条件
Apr 05 SQL Server
SQL Server作业失败:无法确定所有者是否有服务器访问权限的解决方法
Jun 30 SQL Server
SQL语句中JOIN的用法场景分析
Jul 25 SQL Server
Windows环境下实现批量执行Sql文件
Oct 05 SQL Server
MySQL 中如何归档数据的实现方法
Mar 16 SQL Server
通过T-SQL语句创建游标与实现数据库加解密功能
Mar 16 SQL Server
SQL CASE 表达式的具体使用
Mar 21 SQL Server
SQL Server数据库查询出现阻塞之性能调优
Apr 10 SQL Server
SQL Server中的游标介绍
May 20 SQL Server
SQL Server使用T-SQL语句批处理
May 20 SQL Server
SQL使用复合索引实现数据库查询的优化
May 25 SQL Server
SQL Server中使用判断语句(IF ELSE/CASE WHEN )案例
Jul 07 #SQL Server
SQL Server代理:理解SQL代理错误日志处理方法
SQL Server作业失败:无法确定所有者是否有服务器访问权限的解决方法
SQLServer 错误: 15404,无法获取有关 Windows NT 组/用户 WIN-8IVSNAQS8T7\Administrator 的信息
SQL 尚未定义空闲 CPU 条件 - OnIdle 作业计划将不起任何作用
SQLServer中JSON文档型数据的查询问题解决
sql字段解析器的实现示例
Jun 23 #SQL Server
You might like
php实现比较两个字符串日期大小的方法
2015/05/12 PHP
变量在 PHP7 内部的实现(二)
2015/12/21 PHP
laravel如何开启跨域功能示例详解
2017/08/31 PHP
用js实现的一个Flash滚动轮换显示图片代码生成器
2007/03/14 Javascript
jquery 学习之一 对象访问
2010/11/23 Javascript
jQuery getJSON()+.ashx 实现分页(改进版)
2013/03/28 Javascript
Js放到HTML文件中的哪个位置有什么区别
2013/08/21 Javascript
使用JavaScript的ActiveXObject对象检测应用程序是否安装的方法
2014/04/15 Javascript
js 操作符汇总
2014/11/08 Javascript
jQuery异步获取json数据方法汇总
2014/12/22 Javascript
js数组的操作指南
2014/12/28 Javascript
javascript作用域问题实例分析
2015/07/13 Javascript
javascript实现网页端解压并查看zip文件
2015/12/15 Javascript
Bootstrap每天必学之轮播(Carousel)插件
2016/04/25 Javascript
基于JS如何实现类似QQ好友头像hover时显示资料卡的效果(推荐)
2016/06/09 Javascript
confirm确认对话框的实现方法总结
2016/06/17 Javascript
js 获取本地文件及目录的方法(推荐)
2016/11/10 Javascript
jquery实现左右滑动式轮播图
2017/03/02 Javascript
详解vue-router2.0动态路由获取参数
2017/06/14 Javascript
微信小程序引用公共js里的方法的实例详解
2017/08/17 Javascript
Vue-router路由判断页面未登录跳转到登录页面的实例
2017/10/26 Javascript
Vue实现点击时间获取时间段查询功能
2020/08/21 Javascript
JavaScript实现封闭区域布尔运算的示例代码
2018/06/25 Javascript
layui实现下拉框三级联动
2019/07/26 Javascript
javascript实现贪吃蛇小游戏
2020/07/28 Javascript
python字典基本操作实例分析
2015/07/11 Python
Mac中Python 3环境下安装scrapy的方法教程
2017/10/26 Python
Python查看微信撤回消息代码
2018/06/07 Python
spark dataframe 将一列展开,把该列所有值都变成新列的方法
2019/01/29 Python
Python操作Jira库常用方法解析
2020/04/10 Python
澳大利亚排名第一的在线酒类商店:MyBottleShop
2018/04/26 全球购物
即时搜索数百万张门票:SeatsForEveryone.com
2018/08/26 全球购物
财务会计专业应届毕业生求职信
2013/10/18 职场文书
区域销售主管岗位职责
2014/06/15 职场文书
团队拓展活动方案
2014/08/28 职场文书
简单租房协议书(范本)
2014/10/13 职场文书