数据库之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数据定义——模式与基本表操作
Apr 05 SQL Server
SqlServer: 如何更改表的文件组?(进而改变存储位置)
Apr 05 SQL Server
SQL Server连接查询的实用教程
Apr 07 SQL Server
SQLServer 日期函数大全(小结)
Apr 08 SQL Server
SQL Server中交叉联接的用法详解
Apr 22 SQL Server
数据库之SQL技巧整理案例
Jul 07 SQL Server
SQL Server表分区删除详情
Oct 16 SQL Server
sql时间段切分实现每隔x分钟出一份高速门架车流量
Feb 28 SQL Server
SQL Server数据库查询出现阻塞之性能调优
Apr 10 SQL Server
Sql Server 行数据的某列值想作为字段列显示的方法
Apr 20 SQL Server
SQL Server 中的事务介绍
May 20 SQL Server
SQL Server使用CROSS APPLY与OUTER APPLY实现连接查询
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使用数据库永久连接方式操作MySQL的是与非
2013/06/05 PHP
php使用str_replace实现输入框回车替换br的方法
2014/11/24 PHP
PHP传参之传值与传址的区别
2015/04/24 PHP
Zend Framework教程之配置文件application.ini解析
2016/03/10 PHP
PHP自定义错误处理的方法分析
2018/12/19 PHP
THREE.JS入门教程(1)THREE.JS使用前了解
2013/01/24 Javascript
jquery ready函数、css函数及text()使用示例
2013/09/27 Javascript
js实现文本框宽度自适应文本宽度的方法
2015/08/13 Javascript
基于javascript实现图片左右切换效果
2016/01/25 Javascript
NodeJS和BootStrap分页效果的实现代码
2016/11/07 NodeJs
详解Nodejs之npm&amp;package.json
2017/06/15 NodeJs
不得不看之JavaScript构造函数及new运算符
2017/08/21 Javascript
原生JS实现移动端web轮播图详解(结合Tween算法造轮子)
2017/09/10 Javascript
vuex操作state对象的实例代码
2018/04/25 Javascript
讲解vue-router之什么是编程式路由
2018/05/28 Javascript
vue-cli项目修改文件热重载失效的解决方法
2018/09/19 Javascript
js canvas画布实现高斯模糊效果
2018/11/27 Javascript
zepto.js 实时监听输入框的方法
2018/12/04 Javascript
vuex存储token示例
2019/11/11 Javascript
跟老齐学Python之数据类型总结
2014/09/24 Python
你真的了解Python的random模块吗?
2017/12/12 Python
单链表反转python实现代码示例
2018/02/08 Python
Python实现将数据框数据写入mongodb及mysql数据库的方法
2018/04/02 Python
Python连接Redis的基本配置方法
2018/09/13 Python
Python函数参数匹配模型通用规则keyword-only参数详解
2019/06/10 Python
python 魔法函数实例及解析
2019/09/25 Python
Pytorch中膨胀卷积的用法详解
2020/01/07 Python
python:删除离群值操作(每一行为一类数据)
2020/06/08 Python
html5+css3气泡组件的实现
2014/11/21 HTML / CSS
美国最好的葡萄酒网上商店:Wine Library
2019/11/02 全球购物
物业保安员岗位职责
2014/03/14 职场文书
中秋节寄语2015
2015/03/24 职场文书
我爱我班主题班会
2015/08/13 职场文书
优秀范文:《但愿人长久》教学反思3篇
2019/10/24 职场文书
python 详解turtle画爱心代码
2022/02/15 Python
MySQL导致索引失效的几种情况
2022/06/25 MySQL