本文目录列表:
 
SQL Serve季时间粒度
 
    季时间粒度也即是季度时间粒度。一年每3个月是一个季,一年共4季,1月到3月是第1季、4月到6月是第2个季、依次顺延。季也是日期时间范围的,我们也会引入季基准日期,也就是每个季度的第一天。以下提供季基准日期和整数相互转换的功能的实现,还有获取指定日期时间所在当前年内的季索引,从1开始计数,包括1、2、3、4。
 
    提供季基准日期和整数相互转换的功能函数,T-SQL代码如下:
  1. IF OBJECT_ID(N'dbo.ufn_Quarters', 'FN') IS NOT NULL
  2. BEGIN
  3. DROP FUNCTION dbo.ufn_Quarters;
  4. END
  5. GO
  6.  
  7. --==================================
  8. -- 功能: 获得指定日期时间基于基准日期的总季数(一个整数值)
  9. -- 说明: 如果指定的日期时间为NULL或者小于基准日期“1900-01-01”时,则其值默认基准日期
  10. -- 结果值为非负整数,从0开始计数。
  11. -- 作者: XXX
  12. -- 创建: yyyy-MM-dd
  13. -- 修改: yyyy-MM-dd XXX 修改内容描述
  14. -- 调用: SET @sintQuarters = dbo.ufn_Quarters('2008-01-14')
  15. --==================================
  16. CREATE FUNCTION dbo.ufn_Quarters
  17. (
  18. @dtmDate DATETIME -- 指定的日期时间
  19. ) RETURNS SMALLINT
  20. --$Encode$--
  21. AS
  22. BEGIN
  23. SET @dtmDate = dbo.ufn_GetValidDate(@dtmDate);
  24.  
  25. -- datepart参数也可以为qqq
  26. RETURN DATEDIFF(QUARTER, '1900-01-01', @dtmDate);
  27. END
  28. GO
  29.  
  30. IF OBJECT_ID(N'dbo.ufn_Quarters2Date', 'FN') IS NOT NULL
  31. BEGIN
  32. DROP FUNCTION dbo.ufn_Quarters2Date;
  33. END
  34. GO
  35.  
  36. --==================================
  37. -- 功能: 获得一个整数值基于基准日期对应的季基准日期
  38. -- 说明: 如果指定的整数值为NULL或为负整数时,则其值默认为0
  39. -- 如果指定的整数值大于“9999-12-31”对应的整数值时,则其值默认设置为“9999-12-31”对应的整数值;
  40. -- 结果值为从基准日期开始计数的日期;
  41. -- 季基准日期是指所在季度的第一个月份中第1天对应的日期,比如'2016-06-08'月份的姐旬基准日期为'2016-04-01'
  42. -- 作者: XXX
  43. -- 创建: yyyy-MM-dd
  44. -- 修改: yyyy-MM-dd XXX 修改内容描述
  45. -- 调用: SET @dtmDate = dbo.ufn_Quarters2Date(300) --'1975-02-21'
  46. --==================================
  47. CREATE FUNCTION dbo.ufn_Quarters2Date
  48. (
  49. @sintQuarters SMALLINT
  50. ) RETURNS DATETIME
  51. --$Encode$--
  52. AS
  53. BEGIN
  54. SET @sintQuarters = dbo.ufn_GetValidDateNum(@sintQuarters);
  55.  
  56. DECLARE @sintMaxQuarters AS SMALLINT;
  57. SET @sintMaxQuarters = dbo.ufn_Quarters('9999-12-31');
  58.  
  59. IF @sintQuarters >= @sintMaxQuarters
  60. BEGIN
  61. SET @sintQuarters = @sintMaxQuarters;
  62. END
  63.  
  64. -- datepart参数也可以为qqq
  65. RETURN DATEADD(QUARTER, @sintQuarters, '1900-01-01')
  66. END
  67. GO
  
    获取指定日期时间在当前年的旬索引的功能函数,T-SQL代码如下:
  1. IF OBJECT_ID(N'dbo.ufn_QuarterOfYear', 'FN') IS NOT NULL
  2. BEGIN
  3. DROP FUNCTION dbo.ufn_QuarterOfYear;
  4. END
  5. GO
  6.  
  7. --==================================
  8. -- 功能: 获取指定的日期时间所在当前年内的旬索引
  9. -- 说明: 结果从1开始计数,1234分别表示第1季度、第2季度、第3季度、第4季度。
  10. -- 作者: XXX
  11. -- 创建: yyyy-MM-dd
  12. -- 修改: yyyy-MM-dd XXX 修改内容描述
  13. -- 调用: SET @tintQuarterOfYear = dbo.ufn_QuarterOfYear('2016-01-11');
  14. --==================================
  15. CREATE FUNCTION dbo.ufn_QuarterOfYear
  16. (
  17. @dtmDate DATETIME --指定的日期时间
  18. ) RETURNS TINYINT
  19. --$Encode$--
  20. AS
  21. BEGIN
  22. -- datepart参数也可以为qqq
  23. RETURN DATEPART(QUARTER, @dtmDate);
  24. END
  25. GO
    测试以上三个功能函数的效果,T-SQL代码如下:
  1. DECLARE @dtmDate AS DATETIME;
  2. SET @dtmDate = '2016-01-11';
  3.  
  4. SELECT @dtmDate AS 'The Current Date'
  5. ,dbo.ufn_Quarters(@dtmDate) AS 'The Total Of Quarters Base-on Basedate"1900-01-01"'
  6. ,dbo.ufn_Quarters2Date(dbo.ufn_Quarters(@dtmDate)) AS 'Quarter Basedate Mapping'
  7. ,dbo.ufn_QuarterOfYear(@dtmDate) AS 'The Quarter IndexID,Starting With 1';
  8.  
  9. SET @dtmDate = '2016-09-11';
  10.  
  11. SELECT @dtmDate AS 'The Current Date'
  12. ,dbo.ufn_Quarters(@dtmDate) AS 'The Total Of Quarters Base-on Basedate"1900-01-01"'
  13. ,dbo.ufn_Quarters2Date(dbo.ufn_Quarters(@dtmDate)) AS 'Quarter Basedate Mapping'
  14. ,dbo.ufn_QuarterOfYear(@dtmDate) AS 'The Quarter IndexID,Starting With 1'
  15. GO

执行后的查询结果如下图

 
SQL Server年时间粒度
 
    年时间粒度很容易理解的,在SQL Server提供的有关日期时间数据类型中,能够支持日期部分的最大范围区间是[0000-01-01,9999-12-31],那么指定日期在这个日期范围的年索引是从1开始,包括1、2、3、……、9998、9999。年基准日期也即是当前年的第一天,比如"2016-01-11"所在当前年的年基准日期是”2016-01-01“,提供年基准日期和整数相互转换的功能函数实现。
    
    获取指定的日期时间所在日期的年索引的功能函数,T-SQL代码如下:
  1. IF OBJECT_ID(N'dbo.ufn_YearOfDate', 'FN') IS NOT NULL
  2. BEGIN
  3. DROP FUNCTION dbo.ufn_YearOfDate;
  4. END
  5. GO
  6.  
  7. --==================================
  8. -- 功能: 获取指定的日期时间所在日期内的年索引
  9. -- 说明: 结果从1开始计数,123、……、99989999
  10. -- 作者: XXX
  11. -- 创建: yyyy-MM-dd
  12. -- 修改: yyyy-MM-dd XXX 修改内容描述
  13. -- 调用: SET @sintYearOfDate = dbo.ufn_YearsOfDate('2016-01-11');
  14. --==================================
  15. CREATE FUNCTION dbo.ufn_YearOfDate
  16. (
  17. @dtmDate DATETIME --指定的日期时间
  18. ) RETURNS SMALLINT
  19. --$Encode$--
  20. AS
  21. BEGIN
  22. RETURN YEAR(@dtmDate);
  23. END
  24. GO
    提供年基准日期和整数相互转换的功能函数,T-SQL代码如下:
  1. IF OBJECT_ID(N'dbo.ufn_Years', 'FN') IS NOT NULL
  2. BEGIN
  3. DROP FUNCTION dbo.ufn_Years;
  4. END
  5. GO
  6.  
  7. --==================================
  8. -- 功能: 获得指定日期时间基于基准日期的总年数(一个整数值)
  9. -- 说明: 如果指定的日期时间为NULL或者小于基准日期“1900-01-01”时,则其值默认基准日期
  10. -- 结果值为非负整数,从0开始计数。
  11. -- 作者: XXX
  12. -- 创建: yyyy-MM-dd
  13. -- 修改: yyyy-MM-dd XXX 修改内容描述
  14. -- 调用: SET @intMonths = dbo.ufn_Years('2008-01-14')
  15. --==================================
  16. CREATE FUNCTION dbo.ufn_Years
  17. (
  18. @dtmDate DATETIME -- 指定的日期时间
  19. ) RETURNS SMALLINT
  20. --$Encode$--
  21. AS
  22. BEGIN
  23. SET @dtmDate = dbo.ufn_GetValidDate(@dtmDate);
  24.  
  25. -- datepart参数也可以为yyyyyy
  26. RETURN DATEDIFF(YEAR, '1900-01-01', @dtmDate)
  27. END
  28. GO
  29.  
  30. IF OBJECT_ID(N'dbo.ufn_Years2Date', 'FN') IS NOT NULL
  31. BEGIN
  32. DROP FUNCTION dbo.ufn_Years2Date;
  33. END
  34. GO
  35.  
  36. --==================================
  37. -- 功能: 获得一个整数值基于基准日期对应的年基准日期
  38. -- 说明: 如果指定的整数值为NULL或为负整数时,则其值默认为0
  39. -- 如果指定的整数值大于“9999-12-31”对应的整数值时,则其值默认设置为“9999-12-31”对应的整数值;
  40. -- 结果值为从基准日期开始计数的日期;
  41. -- 年基准日期是指所在年的第一个月份中第1天对应的日期,比如'2016-06-08'月份的姐旬基准日期为'2016-01-01'
  42. -- 作者: XXX
  43. -- 创建: yyyy-MM-dd
  44. -- 修改: yyyy-MM-dd XXX 修改内容描述
  45. -- 调用: SET @dtmDate = dbo.ufn_Years2Date(300) --'1975-02-21'
  46. --==================================
  47. CREATE FUNCTION dbo.ufn_Years2Date
  48. (
  49. @sintYears SMALLINT
  50. ) RETURNS DATETIME
  51. --$Encode$--
  52. AS
  53. BEGIN
  54. SET @sintYears = dbo.ufn_GetValidDateNum(@sintYears);
  55.  
  56. DECLARE @sintMaxYears AS SMALLINT;
  57. SET @sintMaxYears = dbo.ufn_Years('9999-12-31');
  58.  
  59. IF @sintYears >= @sintMaxYears
  60. BEGIN
  61. SET @sintYears = @sintMaxYears;
  62. END
  63.  
  64. -- datepart参数也可以为yyyyyy
  65. RETURN DATEADD(YEAR, @sintYears, '1900-01-01')
  66. END
  67. GO
    测试以上3个功能函数的效果,T-SQL代码如下:
  1. DECLARE @dtmDate AS DATETIME;
  2. SET @dtmDate = '2016-01-11';
  3.  
  4. SELECT @dtmDate AS 'The Current Date'
  5. ,dbo.ufn_Years(@dtmDate) AS 'The Total Of Years Base-on Basedate"1900-01-01"'
  6. ,dbo.ufn_Years2Date(dbo.ufn_Years(@dtmDate)) AS 'Year Basedate Mapping'
  7. ,dbo.ufn_YearOfDate(@dtmDate) AS 'The Year IndexID,Starting With 1';
  8.  
  9. SET @dtmDate = '2016-09-11';
  10.  
  11. SELECT @dtmDate AS 'The Current Date'
  12. ,dbo.ufn_Years(@dtmDate) AS 'The Total Of Years Base-on Basedate"1900-01-01"'
  13. ,dbo.ufn_Years2Date(dbo.ufn_Years(@dtmDate)) AS 'Year Basedate Mapping'
  14. ,dbo.ufn_YearOfDate(@dtmDate) AS 'The Year IndexID,Starting With 1';
  15. GO

执行后的查询结果如下图

 
总结语
    
    本文主要提供了季和年这两个时间粒度的讲解,也分别提供的其基准日期和整数相互转换的功能实现,还有各自有关的索引功能函数。之前的博文也有获取比如旬内日索引、月内日索引、月内旬索引等等的相关功能函数,这些都不是基于基准日期”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. jQuery Ready 与 Window onload 的区别(转)

    “我们都知道,很多时候,在页面加载完后都需要做一些相应的初始化动作.例如,运行某些js特效,设置表单等等.怎么知道页面加载完了呢?一 般情况下都是设置body标签的onload监听window的loa ...

  2. 【腾讯Bugly干货分享】从0到1打造直播 App

    本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/5811d42e7fd6ec467453bf58 作者:李智文 概要 分享内容: ...

  3. Nim教程【十二】

    排除指定符号 一般情况下使用import语句,会把一个模块内的符号都导入进来 如果你像排除特定的符号(不想让某些符号被导入进来) 可以使用except子句 就像下面这样 import mymodule ...

  4. 浅谈Excel开发:一 Excel 开发概述

        做Office相关的开发工作快一年多了,在这一年多里,在插件的开发中遇到了各种各样的问题和困难,还好同事们都很厉害,在和他们的交流讨论中学到了很多的知识.目前Office相关的开发资料是比较少 ...

  5. Linux date命令

    命令概述 date命令可以用来设置和显示系统当前时间,特别是在有一些Shell命令里面用到date命令来做日期的不同的显示,所以该命令也是非常需要掌握的一个命令. 语法 date [OPTION].. ...

  6. JavaScript 常用功能总结

    小编吐血整理加上翻译,太辛苦了~求赞! 本文主要总结了JavaScript 常用功能总结,如一些常用的JS 对象,基本数据结构,功能函数等,还有一些常用的设计模式. 目录: 众所周知,JavaScri ...

  7. NanoProfiler - 适合生产环境的性能监控类库 之 实践ELK篇

    上期回顾 上一期:NanoProfiler - 适合生产环境的性能监控类库 之 大数据篇 上次介绍了NanoProfiler的大数据分析理念,一晃已经时隔一年多了,真是罪过! 有朋友问到何时开源的问题 ...

  8. Java中常用修饰符使用汇总

    修饰符汇总: 一:public protected default private 修饰类,修饰方法,修饰属性,修饰代码块.  类: 顶级类只能用public 修饰,顶级类不能使用private 和p ...

  9. KnockoutJS 3.X API 第四章 数据绑定(5) 控制流component绑定

    本节目录: 一个例子 API 备注1:仅模板式的component 备注2:component虚拟绑定 备注3:传递标记到component绑定 内存管理 一个例子 First instance, w ...

  10. jqGrid实现当前页列合计与总计

    当前页列合计    js代码如下:   ... footerrow: true, gridComplete: function () { var rowNum = parseInt($(this).g ...