SQL Server时间粒度系列----第4节季、年时间粒度详解
- 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
- 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
- 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
执行后的查询结果如下图:


- 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
- 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
- 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
执行后的查询结果如下图:


1、https://msdn.microsoft.com/zh-cn/library/ms186819(v=sql.90).aspx
SQL Server时间粒度系列----第4节季、年时间粒度详解的更多相关文章
- 【目录】sql server 进阶篇系列
随笔分类 - sql server 进阶篇系列 sql server 下载安装标记 摘要: SQL Server 2017 的各版本和支持的功能 https://docs.microsoft.com/ ...
- SQL Server调优系列基础篇
前言 关于SQL Server调优系列是一个庞大的内容体系,非一言两语能够分析清楚,本篇先就在SQL 调优中所最常用的查询计划进行解析,力图做好基础的掌握,夯实基本功!而后再谈谈整体的语句调优. 通过 ...
- SQL Server调优系列基础篇(常用运算符总结——三种物理连接方式剖析)
前言 上一篇我们介绍了如何查看查询计划,本篇将介绍在我们查看的查询计划时的分析技巧,以及几种我们常用的运算符优化技巧,同样侧重基础知识的掌握. 通过本篇可以了解我们平常所写的T-SQL语句,在SQL ...
- SQL Server调优系列基础篇(并行运算总结篇二)
前言 上一篇文章我们介绍了查看查询计划的并行运行方式. 本篇我们接着分析SQL Server的并行运算. 闲言少叙,直接进入本篇的正题. 技术准备 同前几篇一样,基于SQL Server2008R2版 ...
- SQL Server调优系列基础篇(索引运算总结)
前言 上几篇文章我们介绍了如何查看查询计划.常用运算符的介绍.并行运算的方式,有兴趣的可以点击查看. 本篇将分析在SQL Server中,如何利用先有索引项进行查询性能优化,通过了解这些索引项的应用方 ...
- SQL Server调优系列进阶篇(查询语句运行几个指标值监测)
前言 上一篇我们分析了查询优化器的工作方式,其中包括:查询优化器的详细运行步骤.筛选条件分析.索引项优化等信息. 本篇我们分析在我们运行的过程中几个关键指标值的检测. 通过这些指标值来分析语句的运行问 ...
- SQL Server调优系列进阶篇(深入剖析统计信息)
前言 经过前几篇的分析,其实大体已经初窥到SQL Server统计信息的重要性了,所以本篇就要祭出这个神器了. 该篇内容会很长,坐好板凳,瓜子零食之类... 不废话,进正题 技术准备 数据库版本为SQ ...
- SQL Server调优系列进阶篇(如何维护数据库索引)
前言 上一篇我们研究了如何利用索引在数据库里面调优,简要的介绍了索引的原理,更重要的分析了如何选择索引以及索引的利弊项,有兴趣的可以点击查看. 本篇延续上一篇的内容,继续分析索引这块,侧重索引项的日常 ...
- SQL Server调优系列玩转篇(如何利用查询提示(Hint)引导语句运行)
前言 前面几篇我们分析了关于SQL Server关于性能调优的一系列内容,我把它分为两个模块. 第一个模块注重基础内容的掌握,共分7篇文章完成,内容涵盖一系列基础运算算法,详细分析了如何查看执行计划. ...
随机推荐
- jQuery Ready 与 Window onload 的区别(转)
“我们都知道,很多时候,在页面加载完后都需要做一些相应的初始化动作.例如,运行某些js特效,设置表单等等.怎么知道页面加载完了呢?一 般情况下都是设置body标签的onload监听window的loa ...
- 【腾讯Bugly干货分享】从0到1打造直播 App
本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/5811d42e7fd6ec467453bf58 作者:李智文 概要 分享内容: ...
- Nim教程【十二】
排除指定符号 一般情况下使用import语句,会把一个模块内的符号都导入进来 如果你像排除特定的符号(不想让某些符号被导入进来) 可以使用except子句 就像下面这样 import mymodule ...
- 浅谈Excel开发:一 Excel 开发概述
做Office相关的开发工作快一年多了,在这一年多里,在插件的开发中遇到了各种各样的问题和困难,还好同事们都很厉害,在和他们的交流讨论中学到了很多的知识.目前Office相关的开发资料是比较少 ...
- Linux date命令
命令概述 date命令可以用来设置和显示系统当前时间,特别是在有一些Shell命令里面用到date命令来做日期的不同的显示,所以该命令也是非常需要掌握的一个命令. 语法 date [OPTION].. ...
- JavaScript 常用功能总结
小编吐血整理加上翻译,太辛苦了~求赞! 本文主要总结了JavaScript 常用功能总结,如一些常用的JS 对象,基本数据结构,功能函数等,还有一些常用的设计模式. 目录: 众所周知,JavaScri ...
- NanoProfiler - 适合生产环境的性能监控类库 之 实践ELK篇
上期回顾 上一期:NanoProfiler - 适合生产环境的性能监控类库 之 大数据篇 上次介绍了NanoProfiler的大数据分析理念,一晃已经时隔一年多了,真是罪过! 有朋友问到何时开源的问题 ...
- Java中常用修饰符使用汇总
修饰符汇总: 一:public protected default private 修饰类,修饰方法,修饰属性,修饰代码块. 类: 顶级类只能用public 修饰,顶级类不能使用private 和p ...
- KnockoutJS 3.X API 第四章 数据绑定(5) 控制流component绑定
本节目录: 一个例子 API 备注1:仅模板式的component 备注2:component虚拟绑定 备注3:传递标记到component绑定 内存管理 一个例子 First instance, w ...
- jqGrid实现当前页列合计与总计
当前页列合计 js代码如下: ... footerrow: true, gridComplete: function () { var rowNum = parseInt($(this).g ...