从SQL中比较C#和GetDate()的DateTime.now的准确性

时间:2015-12-30 05:10:28

标签: c# sql-server datetime

我正在做的是,我需要选择一条我刚刚通过DateTime添加的行来获取PK,因为我需要它。

我通过以下方式存储DateTime:

nw我使用DateTime搜索我的表格。

我的问题是,如果让我说我在1分钟内放了2行怎么办? 我的sql表将它们存储起来:

enter image description here

由于毫秒不可见,是否会选择它们?(假设一切都在1分钟内发生)

编辑:这是来自我的asp mvc项目。因此,每次运行我的操作时,$scope.fruits = [ { "type": "fruit", "content": [ { "name": "banana", "type": "edible" } { "name": "apple" "type": "edible" } ], "id": 1 }, { "type": "vegetable", "content": [ { "name": "eggplant", "type": "edible" }, { "name": "poison ivy", "type": "inedible" } ], "id": 2 } ] 都是新的。

2 个答案:

答案 0 :(得分:2)

问题是精确度。 TSQL中的GetDate()函数的精度不是c#DateTime,因为GetDate()返回TSQL DateTime。

TSQL DateTime

  

定义一个日期,该日期与基于24小时制的小数秒的时间相结合。

     

舍入为.000,.003或.007秒的增量

C# DateTime

  

Ticks属性以百万分之一秒为单位表示日期和时间值,Millisecond属性在日期和时间值中返回千分之一秒。但是,如果您使用重复调用DateTime.Now属性来测量已用时间,并且您关心的是小于100毫秒的小时间间隔,则应注意DateTime.Now属性返回的值取决于系统时钟,在Windows 7和Windows 8系统上的分辨率约为15毫秒。

但是你可以使用更新的(从SQL Server 2008开始)SysDateTime(),它返回一个datetime2(7)值,它应该与C#Datetime的精度相匹配。

datetime2(7)

  

定义与基于24小时制的时间相结合的日期。 datetime2可以视为现有日期时间类型的扩展,它具有更大的日期范围,更大的默认小数精度和可选的用户指定精度。

这只是学术上有趣的因为你永远不应该把日期时间用作PK

让我们在2016年11月6日上午1:15说出来。您创建了一条记录:

MyPk
------
2016-11-06 01:15:00

一小时后你又创建了另一条记录......

MyPk
------
2016-11-06 01:15:00
2016-11-06 01:15:00

由于夏令时重复PK。没有夏令时?有很多理由不使用DateTime作为PK(只需谷歌搜索 datetime作为主键)。

仅举几例:

  • 精确选择可能非常困难(毫秒很重要!)
  • 外键成为梦魇
  • 除非所有系统位于同一时区
  • ,否则复制非常困难

答案 1 :(得分:1)

如果您确实希望使用DateTime.Now second精度来查找数据的PK,则不应将其声明为一次并在任何地方使用它。相反,你应该这样使用它:

insertDataToDataBase(data, DateTime.Now);

然后10-20秒后

insertDataToDataBase(data, DateTime.Now); //still use DateTime.Now

这样您的DateTime.Now将始终更新