数据库之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基本使用和简单的CRUD操作
Apr 05 SQL Server
SqlServer: 如何更改表的文件组?(进而改变存储位置)
Apr 05 SQL Server
sql server 累计求和实现代码
Feb 28 SQL Server
Sql Server之数据类型详解
Feb 28 SQL Server
详解在SQLPlus中实现上下键翻查历史命令的功能
Mar 18 SQL Server
SQL Server数据库基本概念、组成、常用对象与约束
Mar 20 SQL Server
SQL Server内存机制浅探
Apr 06 SQL Server
SQL Server使用导出向导功能
Apr 08 SQL Server
如何使用SQL Server语句创建表
Apr 12 SQL Server
SQLServer权限之只开启创建表权限
Apr 12 SQL Server
SQL SERVER中的流程控制语句
May 25 SQL Server
SQL解决未能删除约束问题drop constraint
May 30 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获得用户使用的代理服务器ip即真实ip
2006/12/31 PHP
php 代码优化的42条建议 推荐
2009/09/25 PHP
如何在Ubuntu下启动Apache的Rewrite功能
2013/07/05 PHP
PHP error_log()将错误信息写入一个文件(定义和用法)
2013/10/25 PHP
一个非常完美的读写ini格式的PHP配置类分享
2015/02/12 PHP
PHP进程通信基础之信号
2017/02/19 PHP
Laravel框架分页实现方法分析
2018/06/12 PHP
js原生态函数中使用jQuery中的 $(this)无效的解决方法
2011/05/25 Javascript
jquery实现图片等比例缩放以及max-width在ie中不兼容解决
2013/03/21 Javascript
JQuery中对Select的option项的添加、删除、取值
2013/08/25 Javascript
利用js实现前台动态添加文本框,后台获取文本框内容(示例代码)
2013/11/25 Javascript
jquery改变disabled的boolean状态的三种方法
2013/12/13 Javascript
详解JavaScript基于面向对象之继承实例
2015/12/16 Javascript
学习JavaScript设计模式之享元模式
2016/01/18 Javascript
Bootstrap组件系列之福利篇几款好用的组件(推荐二)
2016/07/12 Javascript
原生js实现类似fullpage的单页/全屏滚动
2017/01/22 Javascript
JS组件系列之Gojs组件 前端图形化插件之利器
2017/11/29 Javascript
微信小程序使用progress组件实现显示进度功能【附源码下载】
2017/12/12 Javascript
Vue项目查看当前使用的elementUI版本的方法
2018/09/27 Javascript
vue中axios封装使用的完整教程
2021/03/03 Vue.js
Python图像灰度变换及图像数组操作
2016/01/27 Python
为Python的Tornado框架配置使用Jinja2模板引擎的方法
2016/06/30 Python
Python闭包思想与用法浅析
2018/12/27 Python
PyCharm 配置远程python解释器和在本地修改服务器代码
2019/07/23 Python
Django之模板层的实现代码
2019/09/09 Python
Python上下文管理器类和上下文管理器装饰器contextmanager用法实例分析
2019/11/07 Python
解决margin 外边距合并问题
2019/07/03 HTML / CSS
客服服务心得体会
2013/12/30 职场文书
物理专业本科生自荐信
2014/01/30 职场文书
如何写求职信
2014/05/24 职场文书
大学迎新标语
2014/06/26 职场文书
学校献爱心活动总结
2014/07/08 职场文书
2014年师德师风工作总结
2014/11/25 职场文书
劳动纠纷调解协议书格式
2014/11/30 职场文书
小学英语教师2015年度个人工作总结
2015/10/14 职场文书
Python测试框架pytest核心库pluggy详解
2022/08/05 Golang