SQL Server时间粒度系列----第1节时间粒度概述

本文目录列表:

1、什么是时间粒度?
2、SQL Server提供的时间粒度
3、SQL Server时间粒度代码演示  

4、SQL Server基准日期

5、总结语
6、参考清单列表

什么是时间粒度?

 

我们知道比如年、季度、月、旬(一个月分为上中下3旬)、日这样的时间单位;也知道小时、分钟、秒;也有短于秒的比如毫秒、微妙、纳秒、飞秒等等时间单位。基于不同的时间,我们可以将时间粒度看作不同时间单位的时间值。

举个例子来说明时间粒度这个问题。一个日期时间值是‘2016-02-29‘,很显然我们知道这个日期所对应的年、月、日分别为2016年、2月和29日,这个29日就是2016年2月第29天(日)。我们也可以继续根据这个日期时间值发问以下的问题:此日期属于2016年第几周?此日期属于所在周的星期几?此日期属于2016年2月的那个旬?此日期属于2016年的第几季度?此日期 又属于所在季度的第几天?此日期属于2016年的上半年还是下半年?此日期属于2016年的第几天?……

有些公司会有自己公司特殊的财务处理周期时间段,比如说:4个月、4个月、3个月为不同时间段的财务处理周期。

SQL Server提供的时间粒度

 

我们来看看SQL Server提供了那些日期时间数据类型,smalldatetime和datetime(SQL Server 2005提供的),后来在SQL Server 2008又新增了date、time、datetime2和datetimeoffset共4个数据类型。以上6种日期时间数据类型用法和区别请参考日期和时间数据类型及函数 (Transact-SQL)

SQL Server针对这些日期时间数据类型的具体一个日期时间值都能得到那些时间粒度呢?我们可以通过datepart函数(https://msdn.microsoft.com/zh-cn/library/ms189794(v=sql.90).aspxhttps://msdn.microsoft.com/zh-cn/library/ms174420(v=sql.100).aspx)可以知道。下面的表格汇总了datepart函数将获得指定日期时间值的哪些时间粒度值:


日期部分

缩写

SQL Server运行版本

year

yy,yyyy

SQL Server 2005 +
quarter
qq,q

SQL Server 2005 +

month

mm,m

SQL Server 2005 +

dayofyear

dy,y

SQL Server 2005 +

day

dd,d

SQL Server 2005 +

week

wk,ww

SQL Server 2005 +

weekday
dw
SQL Server 2005+

hour

hh

SQL Server 2005 +

minute

mi,n

SQL Server 2005 +

second

ss,s

SQL Server 2005 +

millisecond

ms

SQL Server 2005 +

microsecond

mcs

SQL Server 2008 +

nanosecond

ns

SQL Server 2008 +

TZoffset

tz

SQL Server 2008 +

ISO_WEEK

isowk,isoww

SQL Server 2008 +

注意:SQL Server 2005 +表示的意思是:SQL Server 2005以及SQL Server 2005以上版本。

 

SQL Server时间粒度代码演示  

 

1、日期以上时间粒度的T-SQL代码如下:

 1 -- 日期以上时间粒度的T-SQL代码:
 2 DECLARE    @dtmCreateTime AS DATETIME;
 3 SET @dtmCreateTime = ‘2016-02-29 23:59:59.997‘;
 4 SELECT DATEPART(YEAR, @dtmCreateTime) AS ‘Year,yy,yyyy CurrentYear‘;
 5 SELECT DATEPART(QUARTER, @dtmCreateTime) AS ‘Quarter,qq,q CurrentQuarter‘;
 6 SELECT DATEPART(MONTH, @dtmCreateTime) AS ‘Month,mm,m CurrentMonth‘;
 7 SELECT DATEPART(DAYOFYEAR, @dtmCreateTime) AS ‘DayOfYear,dy,y DayOfCurrentYear‘;
 8 SELECT DATEPART(DAY, @dtmCreateTime) AS ‘Day,dd,d DayOfCurrentMonth‘;
 9 SELECT DATEPART(WEEK, @dtmCreateTime) AS ‘Week,wk,ww WeekOfCurrentYear‘, @@DATEFIRST AS ‘FisrtDayOfWeek[可以为1到7,sunday对应的7]‘, DATEPART(WEEKDAY, @dtmCreateTime) AS ‘Weekday,dw WeekdayOfCurrentWeek‘, DATENAME(WEEKDAY, @dtmCreateTime) AS ‘WeekdayName‘;
10 GO

执行后的查询结果如下:

2、时间以下的时间粒度的T-SQL代码:

1 -- 时间以下时间粒度的T-SQL代码:
2 DECLARE    @dtmCreateTime AS DATETIME;
3 SET @dtmCreateTime = ‘2016-02-29 23:59:59.997‘;
4 SELECT DATEPART(HOUR, @dtmCreateTime) AS ‘Hour,hh HourOfDay‘, DATEPART(MINUTE, @dtmCreateTime) AS ‘Minute,mi,n MinuteOfDay‘, DATEPART(SECOND, @dtmCreateTime) AS ‘Second,ss,s SecondOfDay‘,  DATEPART(MILLISECOND, @dtmCreateTime) AS ‘Millisecond,ms MillisecondOfDay‘;
5 SELECT DATEPART(MICROSECOND, @dtmCreateTime) AS ‘Mircosecond,mcs MicrosecondOfDay‘, DATEPART(NANOSECOND, @dtmCreateTime) AS ‘Nanosecond,ns NanosecondOfDay‘;
6 GO

执行后的查询结果如下:

3、时区偏移TZOFFSET时间粒度的T-SQL代码:

1 -- 时区偏移TZOFFSET时间粒度的T-SQL代码:
2 DECLARE @dtmofsDateTime AS DATETIMEOFFSET;
3 SET @dtmofsDateTime = ‘2007-05-10  00:00:01.1234567 +05:10‘
4 SELECT DATEPART (TZOFFSET, @dtmofsDateTime) AS ‘TZoffset,tz TZoffsetMinuteTotal‘;
5 GO

执行后的查询结果如下:

4、 ISO_WEEK时间粒度的T-SQL代码:

1 -- ISO_WEEK时间粒度的T-SQL代码:
2 SELECT DATEPART(ISO_WEEK, ‘2016-01-06‘) AS ‘ISO_WEEK,isowk,isoww ISO_WeekValue‘
3 GO

执行后的查询结果如下:

注意:以下文字摘抄自SQL Server联机帮助,具体请参考:https://msdn.microsoft.com/zh-cn/library/ms174420(v=sql.100).aspx

ISO 8601 包括 ISO 周-日期系统,即周的编号系统。每周都与该周内星期四所在的年份关联。例如,2004 年第 1 周 (2004W01) 从 2003 年 12 月 29 日星期一到 2004 年 1 月 4 日星期天。一年中最大的周数可能为 52 或 53。这种编号方式通常用于欧洲国家/地区,但其他国家/地区很少用到。

不同的国家/地区的编号系统可能不符合 ISO 标准。现在至少可能存在六种编号系统,如下表所示:


每周的第一天


一年的第一周包含


分配两次的周


使用的国家/地区


星期日


1 月 1 日,

第一个星期六,

其中有 1–7 天属于此年



美国


星期一


1 月 1 日,

第一个星期日,

其中有 1–7 天属于此年



大多数欧洲国家和英国


星期一


1 月 4 日,

第一个星期四,

其中有 4-7 天属于此年



ISO 8601,挪威和瑞典


星期一


1 月 7 日,

第一个星期一,

7 天均属于此年



 

星期三


1 月 1 日,

第一个星期二,

其中有 1–7 天属于此年



 

星期六


1 月 1 日,

第一个星期五,

其中有 1–7 天属于此年



 

SQL Server基准日期

 

    我们执行下面的T-SQL代码:

1 SELECT DATEPART(YEAR, 0) AS ‘BaseDateYear‘, DATEPART(MONTH, 0) AS ‘BaseDateMonth‘, DATEPART(DAY, 0) AS ‘BaseDateDay‘;
2 SELECT YEAR(0) AS ‘BaseDateYear‘, MONTH(0) AS ‘BaseDateMonth‘, DAY(0) AS ‘BaseDateDay‘;
3 GO

执行后的查询结果如下:

从上面的查询结果我们可以知道datepart(year, @dtmDateTime)、datepart(month, @dtmDateTime)、datepart(day, @dtmDateTime)分别与year(@dtmDateTime)、month(@dtmDateTime)、day(@dtmDateTime)获得的结果值相同。这个日期“1900-01-01”就是SQL Server提供的基准日期(SQL Server联机帮助成为基准年)。有关这个基准日期的一种特殊用法,就是数据表设计的一种方法消除NULL,将字段设置为NOT NULL加默认值。针对日期时间数据类型字段列的默认值就可以设置为这个“1900-01-01”基准日期。

SQL Server提供的datetime日期时间数据类型,内部使用两个4字节的整数来存储该数据值。第一个4字节存储”基准日期“(即1900年1月1日)之前或之后的天数。基准日期是系统参照日期。另一个4字节存储天的时间,以午夜后经过的1/300秒数表示。SQL Server引擎也是以“1900-01-01”这个基准日期来参考使用的。具体的请参考日期和时间 (Transact-SQL)

后面的博文会更多的使用这个基准日期的。

总结语

    

    我们在本文中了解了有关时间粒度的概述,还有SQL Server提供了那些类型的时间粒度,以及各个时间粒度的T-SQL代码演示,最后我们知道SQL Server 提供了一个基准日期(基准年)“1900-01-01“。

参考清单列表

1、http://baike.baidu.com/link?url=EwLlbVIkgcS3qxQCCdGgM5LfKjufP0-EHyUUOpRyrNoBONePh2NzJszzQvMGQrZOHJ9f8SPA6iBcwk93uR4_OK

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

3、https://msdn.microsoft.com/zh-cn/library/ms174420(v=sql.100).aspx

4、https://msdn.microsoft.com/zh-cn/library/ms186724(v=sql.100).aspx

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

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

时间: 2024-09-28 04:04:44

SQL Server时间粒度系列----第1节时间粒度概述的相关文章

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

本文目录列表: 1.SQL Server季时间粒度2.SQL Server年时间粒度 3.总结语 4.参考清单列表 SQL Serve季时间粒度   季时间粒度也即是季度时间粒度.一年每3个月是一个季,一年共4季,1月到3月是第1季.4月到6月是第2个季.依次顺延.季也是日期时间范围的,我们也会引入季基准日期,也就是每个季度的第一天.以下提供季基准日期和整数相互转换的功能的实现,还有获取指定日期时间所在当前年内的季索引,从1开始计数,包括1.2.3.4. 提供季基准日期和整数相互转换的功能函数,

SQL Server调优系列玩转篇二(如何利用汇聚联合提示(Hint)引导语句运行)

原文:SQL Server调优系列玩转篇二(如何利用汇聚联合提示(Hint)引导语句运行) 前言 上一篇我们分析了查询Hint的用法,作为调优系列的最后一个玩转模块的第一篇.有兴趣的可以点击查看:SQL Server调优系列玩转篇(如何利用查询提示(Hint)引导语句运行) 本篇继续玩转模块的内容,同样,还是希望扎实掌握前面一系列的内容,才进入本模块的内容分析. 闲言少叙,进入本篇的内容. 技术准备 数据库版本为SQL Server2012,利用微软的以前的案例库(Northwind)进行分析,

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

前言 前面几篇我们分析了关于SQL Server关于性能调优的一系列内容,我把它分为两个模块. 第一个模块注重基础内容的掌握,共分6篇文章完成,内容涵盖一系列基础运算算法,详细分析了如何查看执行计划.掌握执行计划优化点,并一一列举了日常我们平常所写的T-SQL语句所会应用的运算符.我相信你平常所写的T-SQL语句在这几篇文章中都能找到相应的分解运算符. 第二个模块注重SQL Server执行T-SQL语句的时候一些内幕解析,共分为5篇文章完成,其中包括:查询优化器的运行方式.运行时几个优化指标值

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

前言 经过前几篇的分析,其实大体已经初窥到SQL Server统计信息的重要性了,所以本篇就要祭出这个神器了. 该篇内容会很长,坐好板凳,瓜子零食之类... 不废话,进正题 技术准备 数据库版本为SQL Server2008R2,利用微软的以前的案例库(Northwind)进行分析,部分内容也会应用微软的另一个案例库AdventureWorks 相信了解SQL Server的朋友,对这两个库都不会太陌生. 概念理解 关于SQL Server中的统计信息,在联机丛书中是这样解释的 查询优化的统计信

SQL Server调优系列基础篇

前言 关于SQL Server调优系列是一个庞大的内容体系,非一言两语能够分析清楚,本篇先就在SQL 调优中所最常用的查询计划进行解析,力图做好基础的掌握,夯实基本功!而后再谈谈整体的语句调优. 通过本篇了解如何阅读和理解查询计划.并且列举一系列最常用的查询执行运算符. 技术准备 基于SQL Server2008R2版本,利用微软的一个更简洁的案例库(Northwind)进行解析. 一.区别不同的运算符 在所有T-SQL语句在执行的时候,都会将语句分解为一些基本的结构单元,这些结构单元统称为:运

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

原文:SQL Server调优系列基础篇(索引运算总结) 前言 上几篇文章我们介绍了如何查看查询计划.常用运算符的介绍.并行运算的方式,有兴趣的可以点击查看. 本篇将分析在SQL Server中,如何利用先有索引项进行查询性能优化,通过了解这些索引项的应用方式可以指导我们如何建立索引.调整我们的查询语句,达到性能优化的目的. 闲言少叙,进入本篇的正题. 技术准备 基于SQL Server2008R2版本,利用微软的一个更简洁的案例库(Northwind)进行解析. 简介 所谓的索引应用就是在我们

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

原文:SQL Server调优系列进阶篇(如何维护数据库索引) 前言 上一篇我们研究了如何利用索引在数据库里面调优,简要的介绍了索引的原理,更重要的分析了如何选择索引以及索引的利弊项,有兴趣的可以点击查看. 本篇延续上一篇的内容,继续分析索引这块,侧重索引项的日常维护以及一些注意事项等. 闲言少叙,进入本篇的主题. 技术准备 数据库版本为SQL Server2012,前几篇文章用的是SQL Server2008RT,内容区别不大,利用微软的以前的案例库(Northwind)进行分析,部分内容也会

SQL Server调优系列基础篇(常用运算符总结)

原文:SQL Server调优系列基础篇(常用运算符总结) 前言 上一篇我们介绍了如何查看查询计划,本篇将介绍在我们查看的查询计划时的分析技巧,以及几种我们常用的运算符优化技巧,同样侧重基础知识的掌握. 通过本篇可以了解我们平常所写的T-SQL语句,在SQL Server数据库系统中是如何分解执行的,数据结果如何通过各个运算符组织形成的. 技术准备 基于SQL Server2008R2版本,利用微软的一个更简洁的案例库(Northwind)进行解析. 一.数据连接 数据连接是我们在写T-SQL语

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

原文:SQL Server调优系列基础篇(并行运算总结篇二) 前言 上一篇文章我们介绍了查看查询计划的并行运行方式. 本篇我们接着分析SQL Server的并行运算. 闲言少叙,直接进入本篇的正题. 技术准备 同前几篇一样,基于SQL Server2008R2版本,利用微软的一个更简洁的案例库(Northwind)进行解析. 内容 文章开始前,我们先来回顾上一篇中介绍的并行运算,来看文章最后介绍的并行运算语句: SELECT B1.[KEY],B1.DATA,B2.DATA FROM BigTa