SqlServer DateTime格式不同的结果

时间:2016-01-15 19:25:01

标签: sql-server datetime

我在下面有两个查询会返回不同的结果。唯一的区别是日期时间戳以不同的方式格式化。哪一个是正确的,为什么它们会返回不同的结果?

SELECT count(*) as ct, 
sum(t.tidamount) as amt
FROM [dbo].[Tids] t (nolock)
where t.tidstartdate >= '2016-01-13' 
and t.tidstartdate <= '2016-01-14'



SELECT count(*) as ct,
SUM(t.tidamount) as amt
FROM  [dbo].[Tids] b (nolock)
WHERE t.tidstartdate >='2016-01-13 00:00:00.000'
AND t.tidstartdate <=  '2016-01-14 23:59:59.999';

3 个答案:

答案 0 :(得分:1)

2016-01-14相当于2016-01-14 00:00:00.000

2016-01-14 23:59:59.999显然相当于2016-01-14 23:59:59.999

这就是区别。哪个是正确的取决于你想要的结果。

答案 1 :(得分:1)

当您只有日期部分(如2016-01-13)时,它与指定全部为零的时间部分相同。 2016-01-132016-01-13 00:00:00.000相同。

这意味着您的第一个示例是要求2016-01-13全天的所有记录以及2016-01-14的第一时刻的所有记录。这几乎永远不会纠正,尽管你经常逃脱它。在这种情况下,您通常希望指定独占上限而非包含:

SELECT count(*) as ct, 
sum(t.tidamount) as amt
FROM [dbo].[Tids] t (nolock)
where t.tidstartdate >= '2016-01-13' 
and t.tidstartdate < '2016-01-14'

请注意< vs <=。这为您提供了所有2016-01-13的确切数据。

第二个查询为您提供了2016-01-132016-01-14的数据,因为时间部分是在2016-01-14的当天结束时设置的。同样,这很少是正确的方法。除了写入更复杂之外,Sql Server中datetime对象的时间精度一直不到.001秒,因此有时会得到意想不到的结果。如果您真的想要这两天,请求这些记录的正确方法是这样的:

SELECT count(*) as ct, 
sum(t.tidamount) as amt
FROM [dbo].[Tids] t (nolock)
where t.tidstartdate >= '2016-01-13' 
and t.tidstartdate < '2016-01-15'

答案 2 :(得分:0)

第一个可能是一天和一个时间跨度,因为您编码t.tidstartdate <= '2016-01-14'而不是t.tidstartdate < '2016-01-14'

第二个可能是将近两天。

所以要澄清一下,如果我只想要2016年的第一天,我会写一些东西:

2016-01-01 <= date and date < 2016-01-02