DateTime2vs DateTime SQL服务器
-
20-09-2019 - |
其他提示
DATETIME2
有一个日期范围内的"0001 / 01 / 01"通过"9999 / 12 / 31"同时 DATETIME
类型仅支持每年1753-9999.
此外,如果您需要, DATETIME2
可以更加精确的条款的时间;时间限于3的1/3毫秒的话 DATETIME2
可以准确到100毫微秒。
这两种类型的地图 System.DateTime
中。净-没有差值存在。
如果你有的选择,我建议使用 DATETIME2
只要有可能。我看不到任何好处使用 DATETIME
(除了向后兼容性)-你就会有较少的麻烦(日期被推范围的理想像那)。
再加上:如果你只需要日期(没有时间的一部分)、使用新的-这样好 DATETIME2
节省你的空间!:-)同样的时间仅仅使用 TIME
.这是什么这些类型都有!
datetime2 赢得大多数方面,除了(旧应用程序兼容性的)
- 大 值的范围
- 更好的 准确度
- 小 存储空间 (如果可选择指定用户的精确度指定)
请注意以下几点
- 语法
- datetime2[(部分秒的精确度=>看看下面存储大小)]
- 精密、规模
- 0至7位,精确度为100毫微秒。
- 默认的精度是7位数字。
- 储存的大小
- 6字节的精度小于3;
- 7字节的精密3和4。
- 所有其他精密 需要8个字节.
- DateTime2(3) 具有同样数量的数字作为日期时间,但使用的7个字节的储存而不是8字节(SQLHINTS-DateTime Vs DateTime2)
- 找到更多 datetime2(SQL server MSDN条)
图片来源:MCT自学培训工具包(考试70-432):Microsoft SQL Server®2008-实施和维护 第3章:表->第1课:创建表->66页
我concurr与@marc_s和@Adam_Poward--DateTime2是优选方法向前迈进。它具有更广泛的日期,以较高的精确度和使用等于或较少的储存(根据的精度).
一件事情的讨论错过了,但是...
@Marc_s国: Both types map to System.DateTime in .NET - no difference there
.这是正确的, 但是,反面是不是真的...和它的问题时做的日期范围搜索(例如"找到我的所有记录的修改5/5/2010").
.网的版本 Datetime
具有类似范围和精度, DateTime2
.当映射。净 Datetime
下来的旧SQL DateTime
一个 隐含的四舍五入的发生.老SQL DateTime
精确至3毫秒。这意味着 11:59:59.997
是接近,你可以得到这一天结束。什么是四舍五入至最后一天。
试试这个:
declare @d1 datetime = '5/5/2010 23:59:59.999'
declare @d2 datetime2 = '5/5/2010 23:59:59.999'
declare @d3 datetime = '5/5/2010 23:59:59.997'
select @d1 as 'IAmMay6BecauseOfRounding', @d2 'May5', @d3 'StillMay5Because2msEarlier'
避免这种隐含的四舍五入是一个重要的原因移到DateTime2.隐含的四舍五入的日期,显然会导致混乱:
- 奇怪的datetime行为SQL服务器
- http://bytes.com/topic/sql-server/answers/578416-weird-millisecond-part-datetime-data-sql-server-2000-a
- SQL服务器2008年和毫秒
- http://improve.dk/archive/2011/06/16/getting-bit-by-datetime-rounding-or-why-235959-999-ltgt.aspx
- http://milesquaretech.com/Blog/post/2011/09/12/DateTime-vs-DateTime2-SQL-is-Rounding-My-999-Milliseconds!.aspx
几乎所有答复和评论已经沉重的优点,光在的缺点。这里的回顾所有利弊,迄今为止,加上一些重要的缺点(在#2)我只见过一次提到或根本没有。
- 赞成:
1.1.更多的ISO符合(ISO8601)(虽然我不知道这是如何发挥作在实践).
1.2.更多的范围(1/1/0001 12/31/9999与1/1/1753-12/31/9999)(尽管额外的范围内,所有前1753年,将有可能不够使用除外,例如 在历史、天文学、地质,等等。应用程序).
1.3.完全匹配的范围内。净的 DateTime
类型的范围内(虽然这两个来回转换没有特别的编码,如果价值观是在目标类型的范围和精度,除了Con#2.1下面其他的错误/四舍五入将发生)。
1.4.更多的精确度(100纳秒又名0.000的,000,1秒。与3.33毫秒aka0.003,有33秒。) (虽然更加精确可能不会使用除外,例如 在工程/科学应用程序).
1.5.当配置 类似的 (在1毫秒不"相同"(如在3.33毫秒)作为伊曼Abidi有权)的精度 DateTime
, 使用的空间更少(7vs.8字节),但是当然,你会失去精密的利益,这可能是一体的两个(其他正在范围)的最吹捧虽然可能不需要的好处)。
- 缺点:
2.1.在经过一个参数的一个。净 SqlCommand
, 你必须指定 System.Data.SqlDbType.DateTime2
如果你可以穿一个值外SQL服务器 DateTime
's范围和/或精确,因为它默认 System.Data.SqlDbType.DateTime
.
2.2.不能以隐含/轻易地转换为一个浮点的数字(#天由于分钟日期间)的价值做下来与它在SQL Server表使用的数值和运营商:
2.2.1.加上或减去#天或部分天。注:使用 DateAdd
功能作为一种解决方法是不平凡的时候你需要考虑多个(如果不是所有的部件的日期的时间。
2.2.2.采取之间的差两个日期时间为目的的"年龄"计算。注:你不能简单地使用SQL服务器的 DateDiff
功能取代,因为它不算 age
因为大多数人的期望,如果这两个日期时间发生了跨越一个日历/钟日时的边界的指定的单位如果即使对于一小部分的单元,它将返回的差异为1单元与0.例如, DateDiff
在 Day
's的两个日期的时间只有1毫秒除了将返回与10(天),如果这些日期时间是在不同的日历天(即"1999-12-31 23:59:59.9999999"和"2000-01-01 00:00:00.0000000").相同的1毫秒差的日期的时间,如果移动,使得他们不跨越一个日历日,将回返的一个"DateDiff"在 Day
's0(天)。
2.2.3.拿 Avg
的日期的时间(在一个总的查询)通过简单地转换为"浮动"的第一然后再回来 DateTime
.
注:转换 DateTime2
一个数字,你必须做点什么样的以下公式仍然假设你的价值有不低于1970年(这意味着你失去所有的额外的范围内加的另一个217年。注:你可不能只需调整的公式,允许额外的范围,因为你可能会遇到数字溢出的问题。
25567 + (DATEDIFF(SECOND, {d '1970-01-01'}, @Time) + DATEPART(nanosecond, @Time) / 1.0E + 9) / 86400.0
–资料来源:" https://siderite.blogspot.com/2015/08/how-to-translate-t-sql-datetime2-to.html “
当然,你也可以 Cast
要 DateTime
第(如果有必要再次回到 DateTime2
),但你会失去精确度和范围(所有之前一年1753)的益处的 DateTime2
与 DateTime
它们包括2个最大,也同时包2少可能需要其回避的问题,为什么使用它,当你失去的隐性/很容易转换为浮点的数字(天数)为加/减/"年龄"(与 DateDiff
) / Avg
计算部分的利益,这是一个很大的一个在我的经验。
顺便说一句, Avg
的日期时间是(或至少 应该 会)的一个重要使用情况。a)除了使用中得到的平均持续时间日期时(由于一个共同的基础日期间)都是用来表示的持续时间(一个常见的做法)、b)它也是有用的,得到了仪表板型的统计数据的平均日期时间是在该日期时列的一系列/组行。c)标准(或至少 应该 是标准的)ad-hoc查询的监测/解决价值观在一个柱,可能不是有效的,没有任何更长时间和/或可能需要被废弃的是列出为每一个值的生计数和(如果适用)的 Min
, Avg
和 Max
日期时的票相关的价值。
DateTime2肆虐,如果你是一个访问开发尝试写Now()领域中的问题。只是做了一个访问>SQL2008年R2移徙与它把所有的日期时间的领域中为DateTime2.追加一个记录与Now()作为值轰炸。这是好上1/1/2012 2:53:04下午,而不是在1/10/2012 2:53:04。
一旦符由的差别。希望这可以帮助别人。
这里是一个例子,它会告诉你的差异储存的大小(bytes)和精确度之间的smalldatetime、datetime datetime2(0),并datetime2(7):
DECLARE @temp TABLE (
sdt smalldatetime,
dt datetime,
dt20 datetime2(0),
dt27 datetime2(7)
)
INSERT @temp
SELECT getdate(),getdate(),getdate(),getdate()
SELECT sdt,DATALENGTH(sdt) as sdt_bytes,
dt,DATALENGTH(dt) as dt_bytes,
dt20,DATALENGTH(dt20) as dt20_bytes,
dt27, DATALENGTH(dt27) as dt27_bytes FROM @temp
其中返回
sdt sdt_bytes dt dt_bytes dt20 dt20_bytes dt27 dt27_bytes
2015-09-11 11:26:00 4 2015-09-11 11:25:42.417 8 2015-09-11 11:25:42 6 2015-09-11 11:25:42.4170000 8
所以如果我想要的信息存储下到第二个而不是毫秒-我可以节省2字节的每一个,如果我使用datetime2(0),而不是时间或datetime2(7).
解释的日期字符串 datetime
和 datetime2
可以不同也一样,当使用非我们 DATEFORMAT
设置。E.g。
set dateformat dmy
declare @d datetime, @d2 datetime2
select @d = '2013-06-05', @d2 = '2013-06-05'
select @d, @d2
此返回 2013-05-06
(即可能6) datetime
, , 2013-06-05
(即六月5) datetime2
.然而,与 dateformat
设置 mdy
,两个 @d
和 @d2
返回 2013-06-05
.
的 datetime
行为似乎不符合 MSDN文件 的 SET DATEFORMAT
其中规定: 一些字符格式,例如ISO8601,解释的独立的日期格式的设定.显然不是真的!
直到我被咬了这个,我一直认为 yyyy-mm-dd
日期将只是处理的权利,不论语言/区域设置。
古老的问题...但我想要加入的东西不是已经陈述过的任何人在这里...(注:这是我自己的观察,所以,不要求任何参考)
Datetime2快当中使用的过滤标准。
TLDR:
在SQL2016年我有一个表格有百万的行和datetime列ENTRY_TIME,因为它需要储存的确切时间秒钟。同时执行一个复杂的查询与许多联接和电子查询,当我使用其中的条款为:
WHERE ENTRY_TIME >= '2017-01-01 00:00:00' AND ENTRY_TIME < '2018-01-01 00:00:00'
查询是现最初时有数百行,但当行数的增加,开始查询,得到这个错误:
Execution Timeout Expired. The timeout period elapsed prior
to completion of the operation or the server is not responding.
我删除了其中的条款,并且出乎意料的是,查询是运行中的1秒,虽然现在的所有行为的所有日期都是牵强。我运行的内部查询与其中的条款,它花了85秒钟,并没有在条款,它采取了0.01秒。
我遇到了许多线程的这里对于这个问题 datetime过滤性能
我优化查询点。但真正的速度我得到的是通过改变该日期时间列datetime2.
现在同样的查询时以前时间不超过第二次。
欢呼
根据 这篇文章, 如果你想有同样的精密的日期时间使用DateTime2你只需要使用DateTime2(3).这应该给你同样的精密度,采取一个较少的字节,并提供扩大的范围。
我只是偶然发现了一个更多的优势 DATETIME2
:它避免了一个错误的蟒蛇 adodbapi
模块,该模块打击,如果一个标准图书馆 datetime
值是通过其具有的非零微秒的 DATETIME
列,但工作如果列定义为 DATETIME2
.
Select ValidUntil + 1
from Documents
上述SQL不会的工作与DateTime2领域。它返回和错误"的操作数类型的冲突:datetime2是不符合int"
增加1得到下一天是开发者已经这样做的日期多年。现在Microsoft有一个超级新datetime2领域,无法处理这个简单的功能。
"让我们使用这种新的类型,是比老一个",我不这样认为!
我认为 DATETIME2
是更好的方式来存储 date
, ,因为它具有更高的效率比
的 DATETIME
.在 SQL Server 2008
你可以使用 DATETIME2
, 它存储的一个日期和时间,需要6-8 bytes
来储存和拥有一个精密的 100 nanoseconds
.因此,任何人谁需要更大的时间精确会想 DATETIME2
.