数据库之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中mod()函数取余数的用法
May 29 SQL Server
在 SQL 语句中处理 NULL 值的方法
Jun 07 SQL Server
SQLServer中exists和except用法介绍
Dec 04 SQL Server
SQL Server中常用截取字符串函数介绍
Mar 16 SQL Server
SQLServer RANK() 排名函数的使用
Mar 23 SQL Server
SQL Server表分区降低运维和维护成本
Apr 08 SQL Server
SQL Server的存储过程与触发器以及系统函数和自定义函数
Apr 10 SQL Server
MSSQL基本语法操作
Apr 11 SQL Server
SQLServer权限之只开启创建表权限
Apr 12 SQL Server
使用MybatisPlus打印sql语句
Apr 22 SQL Server
SqlServer常用函数及时间处理小结
May 08 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 函数语法介绍一
2009/06/14 PHP
PHP调用Webservice实例代码
2011/07/29 PHP
Windows和Linux中php代码调试工具Xdebug的安装与配置详解
2014/05/08 PHP
HTML中嵌入PHP的简单方法
2016/02/16 PHP
PHP判断是否是微信打开,浏览器打开的方法
2018/03/14 PHP
五个jQuery图片画廊插件 推荐
2011/05/12 Javascript
Dom操作之兼容技巧分享
2011/09/20 Javascript
js三种排序算法分享
2012/08/16 Javascript
Jquery选中或取消radio示例
2013/09/29 Javascript
jquery.ui.draggable中文文档(原文翻译)
2013/11/15 Javascript
javascript实现自动输出文本(打字特效)
2015/08/27 Javascript
浅谈JS验证表单文本域输入空格的问题
2017/02/14 Javascript
JavaScript轮播图简单制作方法
2017/02/20 Javascript
详解Vue 事件驱动和依赖追踪
2017/04/22 Javascript
原生JavaScript实现的简单放大镜效果示例
2018/02/07 Javascript
详解vue2.0+axios+mock+axios-mock+adapter实现登陆
2018/07/19 Javascript
关于JavaScript中高阶函数的魅力详解
2018/09/07 Javascript
nodejs require js文件入口,在package.json中指定默认入口main方法
2018/10/10 NodeJs
微信小程序实现手指拖动选项排序
2020/04/22 Javascript
[04:19]完美世界携手游戏风云打造 卡尔工作室模型介绍篇
2013/04/24 DOTA
[52:00]2018DOTA2亚洲邀请赛 4.1 小组赛 A组加赛 LGD vs Optic
2018/04/02 DOTA
关于numpy中np.nonzero()函数用法的详解
2017/02/07 Python
Scrapy抓取京东商品、豆瓣电影及代码分享
2017/11/23 Python
python多线程+代理池爬取天天基金网、股票数据过程解析
2019/08/13 Python
python利用 keyboard 库记录键盘事件
2020/10/16 Python
手把手教你用Django执行原生SQL的方法
2021/02/18 Python
澳大利亚领先的优质葡萄酒拍卖会:Langton’s Fine Wines
2019/03/24 全球购物
西班牙语在线票务市场:SuperBoletería
2019/06/10 全球购物
保安员岗位职责
2013/11/17 职场文书
财务总监管理职责范文
2014/03/09 职场文书
人大代表选举标语
2014/10/07 职场文书
2015年社区中秋节活动总结
2015/03/23 职场文书
司法廉洁教育心得体会
2016/01/20 职场文书
nginx如何将http访问的网站改成https访问
2021/03/31 Servers
2021年pycharm的最新安装教程及基本使用图文详解
2021/04/03 Python
win11无线投屏在哪设置? win11无线投屏功能的使用方法
2022/04/08 数码科技