SQL Server时间粒度系列----第4节季、年时间粒度详解

时间:2022-09-07 12:01:38
本文目录列表:
 
SQL Serve季时间粒度
 
    季时间粒度也即是季度时间粒度。一年每3个月是一个季,一年共4季,1月到3月是第1季、4月到6月是第2个季、依次顺延。季也是日期时间范围的,我们也会引入季基准日期,也就是每个季度的第一天。以下提供季基准日期和整数相互转换的功能的实现,还有获取指定日期时间所在当前年内的季索引,从1开始计数,包括1、2、3、4。
 
    提供季基准日期和整数相互转换的功能函数,T-SQL代码如下:
 IF OBJECT_ID(N'dbo.ufn_Quarters', 'FN') IS NOT NULL
BEGIN
DROP FUNCTION dbo.ufn_Quarters;
END
GO --==================================
-- 功能: 获得指定日期时间基于基准日期的总季数(一个整数值)
-- 说明: 如果指定的日期时间为NULL或者小于基准日期“1900-01-01”时,则其值默认基准日期
-- 结果值为非负整数,从0开始计数。
-- 作者: XXX
-- 创建: yyyy-MM-dd
-- 修改: yyyy-MM-dd XXX 修改内容描述
-- 调用: SET @sintQuarters = dbo.ufn_Quarters('2008-01-14')
--==================================
CREATE FUNCTION dbo.ufn_Quarters
(
@dtmDate DATETIME -- 指定的日期时间
) RETURNS SMALLINT
--$Encode$--
AS
BEGIN
SET @dtmDate = dbo.ufn_GetValidDate(@dtmDate); -- datepart参数也可以为qq或q
RETURN DATEDIFF(QUARTER, '1900-01-01', @dtmDate);
END
GO IF OBJECT_ID(N'dbo.ufn_Quarters2Date', 'FN') IS NOT NULL
BEGIN
DROP FUNCTION dbo.ufn_Quarters2Date;
END
GO --==================================
-- 功能: 获得一个整数值基于基准日期对应的季基准日期
-- 说明: 如果指定的整数值为NULL或为负整数时,则其值默认为0;
-- 如果指定的整数值大于“9999-12-31”对应的整数值时,则其值默认设置为“9999-12-31”对应的整数值;
-- 结果值为从基准日期开始计数的日期;
-- 季基准日期是指所在季度的第一个月份中第1天对应的日期,比如'2016-06-08'月份的姐旬基准日期为'2016-04-01'。
-- 作者: XXX
-- 创建: yyyy-MM-dd
-- 修改: yyyy-MM-dd XXX 修改内容描述
-- 调用: SET @dtmDate = dbo.ufn_Quarters2Date(300) --'1975-02-21'
--==================================
CREATE FUNCTION dbo.ufn_Quarters2Date
(
@sintQuarters SMALLINT
) RETURNS DATETIME
--$Encode$--
AS
BEGIN
SET @sintQuarters = dbo.ufn_GetValidDateNum(@sintQuarters); DECLARE @sintMaxQuarters AS SMALLINT;
SET @sintMaxQuarters = dbo.ufn_Quarters('9999-12-31'); IF @sintQuarters >= @sintMaxQuarters
BEGIN
SET @sintQuarters = @sintMaxQuarters;
END -- datepart参数也可以为qq或q
RETURN DATEADD(QUARTER, @sintQuarters, '1900-01-01')
END
GO
  
    获取指定日期时间在当前年的旬索引的功能函数,T-SQL代码如下:
 IF OBJECT_ID(N'dbo.ufn_QuarterOfYear', 'FN') IS NOT NULL
BEGIN
DROP FUNCTION dbo.ufn_QuarterOfYear;
END
GO --==================================
-- 功能: 获取指定的日期时间所在当前年内的旬索引
-- 说明: 结果从1开始计数,1、2、3、4分别表示第1季度、第2季度、第3季度、第4季度。
-- 作者: XXX
-- 创建: yyyy-MM-dd
-- 修改: yyyy-MM-dd XXX 修改内容描述
-- 调用: SET @tintQuarterOfYear = dbo.ufn_QuarterOfYear('2016-01-11');
--==================================
CREATE FUNCTION dbo.ufn_QuarterOfYear
(
@dtmDate DATETIME --指定的日期时间
) RETURNS TINYINT
--$Encode$--
AS
BEGIN
-- datepart参数也可以为qq或q
RETURN DATEPART(QUARTER, @dtmDate);
END
GO
    测试以上三个功能函数的效果,T-SQL代码如下:
 DECLARE @dtmDate AS DATETIME;
SET @dtmDate = '2016-01-11'; SELECT @dtmDate AS 'The Current Date'
,dbo.ufn_Quarters(@dtmDate) AS 'The Total Of Quarters Base-on Basedate"1900-01-01"'
,dbo.ufn_Quarters2Date(dbo.ufn_Quarters(@dtmDate)) AS 'Quarter Basedate Mapping'
,dbo.ufn_QuarterOfYear(@dtmDate) AS 'The Quarter IndexID,Starting With 1'; SET @dtmDate = '2016-09-11'; SELECT @dtmDate AS 'The Current Date'
,dbo.ufn_Quarters(@dtmDate) AS 'The Total Of Quarters Base-on Basedate"1900-01-01"'
,dbo.ufn_Quarters2Date(dbo.ufn_Quarters(@dtmDate)) AS 'Quarter Basedate Mapping'
,dbo.ufn_QuarterOfYear(@dtmDate) AS 'The Quarter IndexID,Starting With 1'
GO

执行后的查询结果如下图

SQL Server时间粒度系列----第4节季、年时间粒度详解
SQL Server时间粒度系列----第4节季、年时间粒度详解
 
SQL Server年时间粒度
 
    年时间粒度很容易理解的,在SQL Server提供的有关日期时间数据类型中,能够支持日期部分的最大范围区间是[0000-01-01,9999-12-31],那么指定日期在这个日期范围的年索引是从1开始,包括1、2、3、……、9998、9999。年基准日期也即是当前年的第一天,比如"2016-01-11"所在当前年的年基准日期是”2016-01-01“,提供年基准日期和整数相互转换的功能函数实现。
    
    获取指定的日期时间所在日期的年索引的功能函数,T-SQL代码如下:
 IF OBJECT_ID(N'dbo.ufn_YearOfDate', 'FN') IS NOT NULL
BEGIN
DROP FUNCTION dbo.ufn_YearOfDate;
END
GO --==================================
-- 功能: 获取指定的日期时间所在日期内的年索引
-- 说明: 结果从1开始计数,1、2、3、……、9998、9999。
-- 作者: XXX
-- 创建: yyyy-MM-dd
-- 修改: yyyy-MM-dd XXX 修改内容描述
-- 调用: SET @sintYearOfDate = dbo.ufn_YearsOfDate('2016-01-11');
--==================================
CREATE FUNCTION dbo.ufn_YearOfDate
(
@dtmDate DATETIME --指定的日期时间
) RETURNS SMALLINT
--$Encode$--
AS
BEGIN
RETURN YEAR(@dtmDate);
END
GO
    提供年基准日期和整数相互转换的功能函数,T-SQL代码如下:
 IF OBJECT_ID(N'dbo.ufn_Years', 'FN') IS NOT NULL
BEGIN
DROP FUNCTION dbo.ufn_Years;
END
GO --==================================
-- 功能: 获得指定日期时间基于基准日期的总年数(一个整数值)
-- 说明: 如果指定的日期时间为NULL或者小于基准日期“1900-01-01”时,则其值默认基准日期
-- 结果值为非负整数,从0开始计数。
-- 作者: XXX
-- 创建: yyyy-MM-dd
-- 修改: yyyy-MM-dd XXX 修改内容描述
-- 调用: SET @intMonths = dbo.ufn_Years('2008-01-14')
--==================================
CREATE FUNCTION dbo.ufn_Years
(
@dtmDate DATETIME -- 指定的日期时间
) RETURNS SMALLINT
--$Encode$--
AS
BEGIN
SET @dtmDate = dbo.ufn_GetValidDate(@dtmDate); -- datepart参数也可以为yy或yyyy
RETURN DATEDIFF(YEAR, '1900-01-01', @dtmDate)
END
GO IF OBJECT_ID(N'dbo.ufn_Years2Date', 'FN') IS NOT NULL
BEGIN
DROP FUNCTION dbo.ufn_Years2Date;
END
GO --==================================
-- 功能: 获得一个整数值基于基准日期对应的年基准日期
-- 说明: 如果指定的整数值为NULL或为负整数时,则其值默认为0;
-- 如果指定的整数值大于“9999-12-31”对应的整数值时,则其值默认设置为“9999-12-31”对应的整数值;
-- 结果值为从基准日期开始计数的日期;
-- 年基准日期是指所在年的第一个月份中第1天对应的日期,比如'2016-06-08'月份的姐旬基准日期为'2016-01-01'。
-- 作者: XXX
-- 创建: yyyy-MM-dd
-- 修改: yyyy-MM-dd XXX 修改内容描述
-- 调用: SET @dtmDate = dbo.ufn_Years2Date(300) --'1975-02-21'
--==================================
CREATE FUNCTION dbo.ufn_Years2Date
(
@sintYears SMALLINT
) RETURNS DATETIME
--$Encode$--
AS
BEGIN
SET @sintYears = dbo.ufn_GetValidDateNum(@sintYears); DECLARE @sintMaxYears AS SMALLINT;
SET @sintMaxYears = dbo.ufn_Years('9999-12-31'); IF @sintYears >= @sintMaxYears
BEGIN
SET @sintYears = @sintMaxYears;
END -- datepart参数也可以为yy或yyyy
RETURN DATEADD(YEAR, @sintYears, '1900-01-01')
END
GO
    测试以上3个功能函数的效果,T-SQL代码如下:
 DECLARE @dtmDate AS DATETIME;
SET @dtmDate = '2016-01-11'; SELECT @dtmDate AS 'The Current Date'
,dbo.ufn_Years(@dtmDate) AS 'The Total Of Years Base-on Basedate"1900-01-01"'
,dbo.ufn_Years2Date(dbo.ufn_Years(@dtmDate)) AS 'Year Basedate Mapping'
,dbo.ufn_YearOfDate(@dtmDate) AS 'The Year IndexID,Starting With 1'; SET @dtmDate = '2016-09-11'; SELECT @dtmDate AS 'The Current Date'
,dbo.ufn_Years(@dtmDate) AS 'The Total Of Years Base-on Basedate"1900-01-01"'
,dbo.ufn_Years2Date(dbo.ufn_Years(@dtmDate)) AS 'Year Basedate Mapping'
,dbo.ufn_YearOfDate(@dtmDate) AS 'The Year IndexID,Starting With 1';
GO

执行后的查询结果如下图

SQL Server时间粒度系列----第4节季、年时间粒度详解
SQL Server时间粒度系列----第4节季、年时间粒度详解
 
总结语
    
    本文主要提供了季和年这两个时间粒度的讲解,也分别提供的其基准日期和整数相互转换的功能实现,还有各自有关的索引功能函数。之前的博文也有获取比如旬内日索引、月内日索引、月内旬索引等等的相关功能函数,这些都不是基于基准日期”1900-01-01“,都是在SQL Server能支持的最大的日期部分的范围区间【0001-01-01,9999-12-31】的。
    
    以上有关季和年有关的功能函数,使用了ufn_GetValidDate和ufn_GetValidDateNum这两个通用同能函数,可以参考SQL Server时间粒度系列----第3节旬、月时间粒度详解,里面有具体的实现。
 
参考清单列表

1、https://msdn.microsoft.com/zh-cn/library/ms186819(v=sql.90).aspx

SQL Server时间粒度系列----第4节季、年时间粒度详解的更多相关文章

  1. 【目录】sql server 进阶篇系列

    随笔分类 - sql server 进阶篇系列 sql server 下载安装标记 摘要: SQL Server 2017 的各版本和支持的功能 https://docs.microsoft.com/ ...

  2. SQL Server调优系列基础篇

    前言 关于SQL Server调优系列是一个庞大的内容体系,非一言两语能够分析清楚,本篇先就在SQL 调优中所最常用的查询计划进行解析,力图做好基础的掌握,夯实基本功!而后再谈谈整体的语句调优. 通过 ...

  3. SQL Server调优系列基础篇(常用运算符总结——三种物理连接方式剖析)

    前言 上一篇我们介绍了如何查看查询计划,本篇将介绍在我们查看的查询计划时的分析技巧,以及几种我们常用的运算符优化技巧,同样侧重基础知识的掌握. 通过本篇可以了解我们平常所写的T-SQL语句,在SQL ...

  4. SQL Server调优系列基础篇(并行运算总结篇二)

    前言 上一篇文章我们介绍了查看查询计划的并行运行方式. 本篇我们接着分析SQL Server的并行运算. 闲言少叙,直接进入本篇的正题. 技术准备 同前几篇一样,基于SQL Server2008R2版 ...

  5. SQL Server调优系列基础篇(索引运算总结)

    前言 上几篇文章我们介绍了如何查看查询计划.常用运算符的介绍.并行运算的方式,有兴趣的可以点击查看. 本篇将分析在SQL Server中,如何利用先有索引项进行查询性能优化,通过了解这些索引项的应用方 ...

  6. SQL Server调优系列进阶篇(查询语句运行几个指标值监测)

    前言 上一篇我们分析了查询优化器的工作方式,其中包括:查询优化器的详细运行步骤.筛选条件分析.索引项优化等信息. 本篇我们分析在我们运行的过程中几个关键指标值的检测. 通过这些指标值来分析语句的运行问 ...

  7. SQL Server调优系列进阶篇(深入剖析统计信息)

    前言 经过前几篇的分析,其实大体已经初窥到SQL Server统计信息的重要性了,所以本篇就要祭出这个神器了. 该篇内容会很长,坐好板凳,瓜子零食之类... 不废话,进正题 技术准备 数据库版本为SQ ...

  8. SQL Server调优系列进阶篇(如何维护数据库索引)

    前言 上一篇我们研究了如何利用索引在数据库里面调优,简要的介绍了索引的原理,更重要的分析了如何选择索引以及索引的利弊项,有兴趣的可以点击查看. 本篇延续上一篇的内容,继续分析索引这块,侧重索引项的日常 ...

  9. SQL Server调优系列玩转篇(如何利用查询提示(Hint)引导语句运行)

    前言 前面几篇我们分析了关于SQL Server关于性能调优的一系列内容,我把它分为两个模块. 第一个模块注重基础内容的掌握,共分7篇文章完成,内容涵盖一系列基础运算算法,详细分析了如何查看执行计划. ...

随机推荐

  1. Java教程-Java 程序员们值得一看的好书推荐

    学习的最好途径就是看书“,这是我自己学习并且小有了一定的积累之后的第一体会.个人认为看书有两点好处: 能出版出来的书一定是经过反复的思考.雕琢和审核的,因此从专业性的角度来说,一本好书的价值远超其他资 ...

  2. [原]AppPoolService-IIS应用程序池辅助类(C#控制应用程序池操作)

    using System.Collections.Generic; using System.DirectoryServices; using System.Linq; using Microsoft ...

  3. 一个优秀windows C++程序员的知识体系[转]

    转自:一个优秀windows C++程序员的知识体系 思考一个优秀windows C++ 程序员该有哪些知识,可最终发现什么知识都不能少, 看下图: 除了上面知识,程序员还要不断学习, 保持对新知识的 ...

  4. select,epoll的比较

    机制: select:只支持水平触发(数据不处理完无限通知) epoll:支持水平触发和边缘触发(仅通知一次) 单进程监控FD个数 select: 由FD_SETSIZE设置,默认值是2048.在大量 ...

  5. 如何将HDL文件实例化到XPS中

     本文转载自:http://xilinx.eetrend.com/blog/7073 硬件平台:ZedBoard 开发环境:XPS + ISE 操作系统:WinXP SP3 一直说要研究官方的例子 ...

  6. 如何使用Palette提取Bitmap的颜色

    5.X提出了color palette 的概念,能够让主题动态的去适应当前的页面色调,让整个app色调看起来比较和谐统一 那么如何使用Palette呢,必不可少,我们需要在Android studio ...

  7. OC中extern,static,const的用法

    1.const的作用: const仅仅用来修饰右边的变量(基本数据变量p,指针变量*p). 例如 NSString *const SIAlertViewWillDismissNotification; ...

  8. 学号 20175201张驰 《Java程序设计》第8周学习总结

    学号 20175201张驰 <Java程序设计>第8周学习总结 教材学习内容总结 第十五章 知识总结: 1.泛型类声明:可以使用"class 名称"声明一个类,例如:c ...

  9. 08 Zabbix Item类型之Zabbix agent类型

    点击返回:自学Zabbix4.0之路 点击返回:自学zabbix集锦 08 Zabbix Item类型之Zabbix agent类型 Zabbix agent类型的item是使用部署在服务器端的age ...

  10. 【太虚AR&lowbar;v0&period;1】使用教程 &vert; SLAM(Markerless)

    https://blog.csdn.net/VOID_AR/article/details/77715274