本文目录列表:
 
什么是时间粒度?
 
     我们知道比如年、季度、月、旬(一个月分为上中下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代码如下:
 -- 日期以上时间粒度的T-SQL代码:
DECLARE @dtmCreateTime AS DATETIME;
SET @dtmCreateTime = '2016-02-29 23:59:59.997';
SELECT DATEPART(YEAR, @dtmCreateTime) AS 'Year,yy,yyyy CurrentYear';
SELECT DATEPART(QUARTER, @dtmCreateTime) AS 'Quarter,qq,q CurrentQuarter';
SELECT DATEPART(MONTH, @dtmCreateTime) AS 'Month,mm,m CurrentMonth';
SELECT DATEPART(DAYOFYEAR, @dtmCreateTime) AS 'DayOfYear,dy,y DayOfCurrentYear';
SELECT DATEPART(DAY, @dtmCreateTime) AS 'Day,dd,d DayOfCurrentMonth';
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';
GO
执行后的查询结果如下:
 
2、时间以下的时间粒度的T-SQL代码:
 -- 时间以下时间粒度的T-SQL代码:
DECLARE @dtmCreateTime AS DATETIME;
SET @dtmCreateTime = '2016-02-29 23:59:59.997';
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';
SELECT DATEPART(MICROSECOND, @dtmCreateTime) AS 'Mircosecond,mcs MicrosecondOfDay', DATEPART(NANOSECOND, @dtmCreateTime) AS 'Nanosecond,ns NanosecondOfDay';
GO

执行后的查询结果如下:

 
 
3、时区偏移TZOFFSET时间粒度的T-SQL代码:
 -- 时区偏移TZOFFSET时间粒度的T-SQL代码:
DECLARE @dtmofsDateTime AS DATETIMEOFFSET;
SET @dtmofsDateTime = '2007-05-10 00:00:01.1234567 +05:10'
SELECT DATEPART (TZOFFSET, @dtmofsDateTime) AS 'TZoffset,tz TZoffsetMinuteTotal';
GO
执行后的查询结果如下:
 
4、 ISO_WEEK时间粒度的T-SQL代码:
 -- ISO_WEEK时间粒度的T-SQL代码:
SELECT DATEPART(ISO_WEEK, '2016-01-06') AS 'ISO_WEEK,isowk,isoww ISO_WeekValue'
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代码:
 SELECT DATEPART(YEAR, ) AS 'BaseDateYear', DATEPART(MONTH, ) AS 'BaseDateMonth', DATEPART(DAY, ) AS 'BaseDateDay';
SELECT YEAR() AS 'BaseDateYear', MONTH() AS 'BaseDateMonth', DAY() AS 'BaseDateDay';
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“。
 
参考清单列表

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

  1. SQL Server时间粒度系列----第9节时间粒度示例演示

    本文目录列表: 1.准备测试数据 2.向测试数据表添加相关时间粒度字段列 3.基于日月季年统计汇总的演示 4.总结语 5.参考清单列表   准备测试数据   为了提供不同时间粒度示例的演示,就需要测试 ...

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

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

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

    本文目录列表: 1.SQL Server季时间粒度2.SQL Server年时间粒度 3.总结语 4.参考清单列表   SQL Serve季时间粒度       季时间粒度也即是季度时间粒度.一年每3 ...

  4. SQL Server时间粒度系列----第3节旬、月时间粒度详解

    本文目录列表: 1.SQL Server旬时间粒度2.SQL Server月有关时间粒度 3.SQL Server函数重构 4.总结语 5.参考清单列表   SQL Server旬时间粒度       ...

  5. SQL Server调优系列基础篇

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

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

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

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

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

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

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

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

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

随机推荐

  1. HTML5之Canvas时钟(网页效果--每日一更)

    今天,带来的是使用HTML5中Canvas标签实现的动态时钟效果. 话不多说,先看效果:亲,请点击这里 众所周知,Canvas标签是HTML5中的灵魂,HTML5 Canvas是屏幕上的一个由Java ...

  2. [.NET领域驱动设计实战系列]专题四:前期准备之工作单元模式(Unit Of Work)

    一.前言 在前一专题中介绍了规约模式的实现,然后在仓储实现中,经常会涉及工作单元模式的实现.然而,在我的网上书店案例中也将引入工作单元模式,所以本专题将详细介绍下该模式,为后面案例的实现做一个铺垫. ...

  3. RCP:拖拽功能的实现 Drag and Drop

    SWT中的拖拽是使用的org.eclipse.swt.dnd. 有三个需要密切注意的类: 1.DragSource 2.DropTarget 3.Transfer DragSource封装了需要被拖拽 ...

  4. 必须知道的SQL编写技巧,多条件查询不拼字符串的写法

    在做项目中,我们经常遇到复杂的查询方法,要根据用户的输入,判断某个参数是否合法,合法的话才能当作过滤条件,我们通常的做法是把查询SQL赋值给一个字符串变量,然后根据判断条件动态的拼接where条件进行 ...

  5. 用手机访问本地环境的利器ngrok

    我们在调试移动端页面,尤其是调试微信页面的时候,会遇到这样的情况,手机连着公司的wifi,开发环境(台式机)插着公司的网线,我们要用手机来访问开发环境下的页面.这个时候,如果网线和wifi是在同一个网 ...

  6. Setting up SSL for SCM-Manager with Microsoft CA and TortoiseHg

    You can configure SSL for SCM-Manager so that the communication of your repositories are encrypted. ...

  7. Redmined的历史记录显示 "Updated by {{author}} {{age}} ago"

    最近Redmine出了点问题,简单查了一下,是ruby的本地冲突包i18n导致的, 先到redmine中跑命令: gem list --local,  查出本地ruby安装的所有的包 这里可以看到i1 ...

  8. vi 卡住怎么办

    http://zhidao.baidu.com/question/93283359.html ---------- 我貌似好像按了ctrl+s... 用惯了windows人,会习惯性地按Ctrl+S来 ...

  9. jQuery.fn.extend(object) object中this的指向

    看到下面的代码后,一下子懵逼了.这个this指向哪儿去了. jQuery.fn.extend({ check: function() { return this.each(function() { t ...

  10. iOS xcode6 添加.pch文件

    1, 新建文件 (command+N)选择other组,再次选择pch,输入文件名保存. eg: 创建的工程为Demo; 创建文件名为DemoPrefixHeader.pch 2,到工程里面的buil ...