sql server 2008 offer 4 kinds of date datatypes
在mssql 9.0 以前,只有2种日期的数据类型,长短日期型。现在,即将在三月份正式发布的版本将支持DATE, TIME, DATETIMEOFFSET and DATETIME2.
DATE
很多人都比较迷惑在不需要日期精确的情况下却存储了许多不应该存储的。比如你只需要精确到日期,却不需要小时分秒,但是目前的日期类数据类型却不允许这样,如果转成char型,也是很不值得。
一条这样的语句:
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的小数点位数,具体参考如下:
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
DATE
很多人都比较迷惑在不需要日期精确的情况下却存储了许多不应该存储的。比如你只需要精确到日期,却不需要小时分秒,但是目前的日期类数据类型却不允许这样,如果转成char型,也是很不值得。
一条这样的语句:

(当然这个实现还是可以多样的,你可以使用Between and 来绕弯实现利用索引的。原文举例的是这个语句)
但是如果有只是存储整数部分的日期就好了。2008版的date类型就是你想要的!
(补充一下:mssql里面对日期类型的存储是这样的:将日期部分存储成一个整数,将日期的后面的屁股存储成小数部分,然后拼加在一起存在数据库内是一个类似于float类型的数据。具体可以演练这样一段代码:






附带:date的取值范围是0001-01-01 到9999-12-31
TIME
这个类型也就顾名思义其实就是刚才date类型的尾巴,取值范围是00:00:00.0000000 到23:59:59.9999999
DATETIME2
这个类型是让你可以指定时间的精确度,比如:







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
主要是针对时区来的,可以在时间上加上时区。例如:













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













参考自:http://www.sql-server-performance.com/articles/dev/datetime_2008_p1.aspx
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· 展开说说关于C#中ORM框架的用法!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?