设为首页 收藏本站
查看: 3035|回复: 0

[经验分享] sql server 2008 offer 4 kinds of date datatypes

[复制链接]

尚未签到

发表于 2015-7-2 08:40:03 | 显示全部楼层 |阅读模式
在mssql 9.0 以前,只有2种日期的数据类型,长短日期型。现在,即将在三月份正式发布的版本将支持DATE, TIME, DATETIMEOFFSET and DATETIME2.

DATE
很多人都比较迷惑在不需要日期精确的情况下却存储了许多不应该存储的。比如你只需要精确到日期,却不需要小时分秒,但是目前的日期类数据类型却不允许这样,如果转成char型,也是很不值得。
一条这样的语句:

DSC0000.gif SELECT * FROM tblDate Where datediff(d,[Date],‘2007-10-01’) =0会让你很是郁闷,违反一个基本准则:等号左边操作列。索引用不上不说,还要每次都计算。
(当然这个实现还是可以多样的,你可以使用Between and 来绕弯实现利用索引的。原文举例的是这个语句)

但是如果有只是存储整数部分的日期就好了。2008版的date类型就是你想要的!
(补充一下:mssql里面对日期类型的存储是这样的:将日期部分存储成一个整数,将日期的后面的屁股存储成小数部分,然后拼加在一起存在数据库内是一个类似于float类型的数据。具体可以演练这样一段代码:

select convert(float,getdate())
select datediff(day,0,getdate())
select dateadd(day,0,datediff(day,0,getdate()))
select convert(float,dateadd(day,0,datediff(day,0,getdate())))
select convert(float,getdate()-dateadd(day,0,datediff(day,0,getdate())))

附带:date的取值范围是0001-01-01 到9999-12-31

TIME
这个类型也就顾名思义其实就是刚才date类型的尾巴,取值范围是00:00:00.0000000 到23:59:59.9999999

DATETIME2
这个类型是让你可以指定时间的精确度,比如:

DECLARE @dt7 datetime2(7)

SET @dt7 = Getdate()

PRINT @dt7

--result is 2008-01-3 12:15:11.2340000他一共可以指定从0到7的小数点位数,具体参考如下:
  Fraction
  Output
  0
  2007-10-28 22:11:20
  1
  2007-10-28 22:11:19.7
  2
  2007-10-28 22:11:19.70
  3
  2007-10-28 22:11:19.703
  4
  2007-10-28 22:11:19.7030
  5
  2007-10-28 22:11:19.70300
  6
  2007-10-28 22:11:19.703000
  7
  2007-10-28 22:11:19.7030000

DATETIMEOFFSET
主要是针对时区来的,可以在时间上加上时区。例如:

DECLARE @dt DATETIMEOFFSET(0)

SET @dt = '2007-10-29 22:50:55 -1:00'



DECLARE @dt1 DATETIMEOFFSET(0)

SET @dt1 = '2007-10-29 22:50:55 +5:00'

SELECT DATEDIFF(hh,@dt,@Dt1)

个人感觉用处不是很大。

如果需求需要将日期和时间都分别存储,并且分别建立索引,甚至是联合索引,那么如何得到一个真正的时间呢?

Declare @dt as DATE

Set @dt = getdate()

Declare @dtt as TIME

Set @dtt = getdate()

Select cast(@dt as smalldatetime)  + cast(@dtt as smalldatetime)

Output: 2007-10-28 00:17:00.  




参考自:http://www.sql-server-performance.com/articles/dev/datetime_2008_p1.aspx

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-82426-1-1.html 上篇帖子: MS SQL SERVER中的临时表 下篇帖子: SQL Server的collation问题
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表