本文目录列表:
 
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年时间粒度
 
    年时间粒度很容易理解的,在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

执行后的查询结果如下图

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

    出处:http://www.cnblogs.com/neutra/archive/2012/07/26/2609300.html 最近在做第三方接入的,初步定下使用OAuth2协议,花了些时间对OAu ...

  2. [.net 面向对象编程基础] (6) 基础中的基础——运算符和表达式

    [.net 面向对象编程基础] (6) 基础中的基础——运算符和表达式 说起C#运算符和表达式,小伙伴们肯定以为很简单,其实要用好表达式,不是一件容易的事.一个好的表达式可以让你做事半功倍的效果,比如 ...

  3. Direct2D教程(外篇)环境配置

    2014年世界杯首场淘汰赛马上开始了,闲着没事,整理以前的博客草稿打发时间,意外的发现这篇文章,本来是打算加入到Direct2D那个系列的,不知道为什么把它给遗漏了.环境配置,对于熟手来说,不是什么重 ...

  4. AWS系列之一 亚马逊云服务概述

    云计算经过这几年的发展,已经不再是是一个高大上的名词,而是已经应用到寻常百姓家的技术.每天如果你和互联网打交道,那么或多或少都会和云扯上关系.gmail.github.各种网盘.GAE.heroku等 ...

  5. 大叔也说Xamarin~Android篇~日志的记录

    回到目录 无论哪个平台,开始哪种应用程序,日志总是少不了的,大家在Lind.DDD里也可以看到大叔的日志组件,而在xamarin进行移动开发时,为了更好的调试,记录运行的情况,日志也是必须的,这讲主要 ...

  6. Android开发学习之路-Service和Activity的通信

    在很多时候,Service都不仅仅需要在后台运行,还需要和Activity进行通信,或者接受Activity的指挥,如何来实现,来看代码. 定义一个服务 // 创建一个服务,然后在onBind()中返 ...

  7. Atitit 类库冲突解决方案  httpclient-4.5.2.jar

    Atitit 类库冲突解决方案  httpclient-4.5.2.jar 错误提示如下1 版本如下(client and selenium)2 解决流程2 挂载源码 (SSLConnectionSo ...

  8. Atitit.软件与编程语言中的锁机制原理attilax总结

    Atitit.软件与编程语言中的锁机制原理attilax总结 1. 用途 (Db,业务数据加锁,并发操作加锁.1 2. 锁得类型 排它锁 "互斥锁 共享锁 乐观锁与悲观锁1 2.1. 自旋锁 ...

  9. salesforce 零基础学习(二十)简单APP制作

    本篇参考链接:https://developer.salesforce.com/trailhead/project/salesforce_developer_workshop 本篇讲述的是最简单的AP ...

  10. 对于System.Net.Http的学习(一)——System.Net.Http 简介

    System.Net.Http 是微软推出的最新的 HTTP 应用程序的编程接口, 微软称之为“现代化的 HTTP 编程接口”, 主要提供如下内容: 1. 用户通过 HTTP 使用现代化的 Web S ...