其一:

建议的方式来存储的日期和时间在SQL服务器2008年+?

我知道精度差异(和储存空间可能的),但是忽视那些对于现有的最佳做法的文件时使用什么,或许我们应该只利用 datetime2 只?

有帮助吗?

解决方案

MSDN文件 datetime 建议使用 datetime2.这里是他们的建议:

使用 time, date, datetime2datetimeoffset 数据类型新的 的工作。这些类型与SQL 标准。他们是更便于携带。 time, datetime2datetimeoffset 提供更多秒的精确度。 datetimeoffset 提供次区 支持全局的部署 应用程序。

datetime2具有较大的日期范围内,较大的默认分精确,并可选择指定用户的精确度。还根据用户指定的精度可以使用较少的储存。

其他提示

DATETIME2 有一个日期范围内的"0001 / 01 / 01"通过"9999 / 12 / 31"同时 DATETIME 类型仅支持每年1753-9999.

此外,如果您需要, DATETIME2 可以更加精确的条款的时间;时间限于3的1/3毫秒的话 DATETIME2 可以准确到100毫微秒。

这两种类型的地图 System.DateTime 中。净-没有差值存在。

如果你有的选择,我建议使用 DATETIME2 只要有可能。我看不到任何好处使用 DATETIME (除了向后兼容性)-你就会有较少的麻烦(日期被推范围的理想像那)。

再加上:如果你只需要日期(没有时间的一部分)、使用新的-这样好 DATETIME2 节省你的空间!:-)同样的时间仅仅使用 TIME.这是什么这些类型都有!

datetime2 赢得大多数方面,除了(旧应用程序兼容性的)

  1. 值的范围
  2. 更好的 准确度
  3. 存储空间 (如果可选择指定用户的精确度指定)

SQL Date and time data types compare - datetime,datetime2,date,TIME

请注意以下几点

  • 语法
    • 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.隐含的四舍五入的日期,显然会导致混乱:

几乎所有答复和评论已经沉重的优点,光在的缺点。这里的回顾所有利弊,迄今为止,加上一些重要的缺点(在#2)我只见过一次提到或根本没有。

  1. 赞成:

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字节),但是当然,你会失去精密的利益,这可能是一体的两个(其他正在范围)的最吹捧虽然可能不需要的好处)。

  1. 缺点:

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.例如, DateDiffDay'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

当然,你也可以 CastDateTime 第(如果有必要再次回到 DateTime2),但你会失去精确度和范围(所有之前一年1753)的益处的 DateTime2DateTime 它们包括2个最大,也同时包2少可能需要其回避的问题,为什么使用它,当你失去的隐性/很容易转换为浮点的数字(天数)为加/减/"年龄"(与 DateDiff) / Avg 计算部分的利益,这是一个很大的一个在我的经验。

顺便说一句, Avg 的日期时间是(或至少 应该 会)的一个重要使用情况。a)除了使用中得到的平均持续时间日期时(由于一个共同的基础日期间)都是用来表示的持续时间(一个常见的做法)、b)它也是有用的,得到了仪表板型的统计数据的平均日期时间是在该日期时列的一系列/组行。c)标准(或至少 应该 是标准的)ad-hoc查询的监测/解决价值观在一个柱,可能不是有效的,没有任何更长时间和/或可能需要被废弃的是列出为每一个值的生计数和(如果适用)的 Min, AvgMax 日期时的票相关的价值。

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).

解释的日期字符串 datetimedatetime2 可以不同也一样,当使用非我们 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, 一些客户不支持 日期, 时间, 或 datetime2 并迫使你成一串的文字。具体地说Microsoft提到"下层"ODBC,OLE DB,JDBC,并SqlClient问题与这些数据的类型并有一个 显示了每个可图的类型。

如果价值 兼容性 在精度,可使用 datetime

古老的问题...但我想要加入的东西不是已经陈述过的任何人在这里...(注:这是我自己的观察,所以,不要求任何参考)

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.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top