TSQL DateTime DataType - 小数秒与毫秒

RTh*_*mas 2 sql-server-2008 sql-server datetime

想要从一天中获取所有记录。所以2013-03-05 00:00:00.000和之间的一切2013-03-05 23:59:59.999。我们在后端与发生在2013-03-06 00:00:00.000.

因此,在测试中,我在 SSMS 中运行:

select cast('2013-03-05 23:59:59.999' as datetime)
select cast('2013-03-05 23:59:59.996' as datetime)
select cast('2013-03-05 23:59:59.994' as datetime)
Run Code Online (Sandbox Code Playgroud)

并得到:

2013-03-06 00:00:00.000
2013-03-05 23:59:59.997
2013-03-05 23:59:59.993
Run Code Online (Sandbox Code Playgroud)

毫秒部分会稍微回落。在第一行的情况下,它真的很重要。因为我不想要 2013-03-06 00:00:00.000 - 我想要午夜前一毫秒。

TSQL 在文档中声明它使用小数秒,而不是使用毫秒的 .Net 日期时间。这似乎只是语法上的差异,但如果您真的关心 TSQL 中的毫秒精度,您是否会被迫全面使用DateTime2。从datetime2to 转换datetime仍然会在几毫秒内把事情搞砸。

在 c# 中DateTime.Parse("03/5/2013 23:59:59.999").Millisecond仍然返回 999。

我这样解释好吗?如果我关心毫秒精度,我datetime2只坚持使用。

通常,这将是一个简单的修复,但在这种情况下,我们使用的是datetime作为参数接收的 Microsoft 系统函数。

Han*_*non 6

由于四舍五入,您必须指定 23:59:59.997 而不是指定 23:59:59.999。

更好的方法是:

WHERE MyDate >= '2013-03-05' AND MyDate < '2013-03-06'
Run Code Online (Sandbox Code Playgroud)

由于这捕获了 2013-03-05 的所有活动

  • 这里涵盖了对行为及其处理方式的完整讨论:http://sqlblog.com/blogs/aaron_bertrand/archive/2011/10/19/what-do-between-and-the-devil-have-in -common.aspx (3认同)
  • 更好的是`&gt;= '20130305' AND &lt; '20130306'` - 例如,如果有人设置了`SET LANGUAGE FRENCH;`,查询仍然按预期工作。 (3认同)
  • @RThomas 所以修复其他程序;他们错了。或者自己写。哪些 Microsoft 程序采用日期时间范围并使它们包含在内?即使对他们来说,这似乎也太短视了。 (2认同)