我在下面有两个查询会返回不同的结果。唯一的区别是日期时间戳以不同的方式格式化。哪一个是正确的,为什么它们会返回不同的结果?
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';
答案 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-13
与2016-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-13
和2016-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