Sql server SqlServer日期时间格式不同的结果

Sql server SqlServer日期时间格式不同的结果,sql-server,datetime,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

下面有两个查询返回不同的结果。唯一的区别是日期时间戳的格式不同。哪一个是正确的,为什么他们返回不同的结果

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';
选择计数(*)作为ct,
作为金额的金额(t.tidamount)
从[dbo].[Tids]t(nolock)
其中t.tidstartdate>='2016-01-13'
和t.tidstartdate='2016-01-13 00:00:00.000'

而t.tidstartdate
2016-01-14
相当于
2016-01-14 00:00:00.000

2016-01-14 23:59:59.999显然等同于
2016-01-14 23:59:59.999


这就是区别。正确与否取决于您想要的结果。

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

2016-01-14 23:59:59.999显然等同于
2016-01-14 23:59:59.999


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

当您只有日期部分(如
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'

当您只有日期部分(如
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'

第一个可能是一天和一个时间跨度,因为您编码
t.tidstartdate第一个可能是一天和一个时间跨度,因为您编码
t.tidstartdate,如果类型是
datetime
2016-01-14 23:59:59.999
将等同于
2016-01-15 00:00:00.000
,因为
datetime
只有1/300秒的分辨率<代码>选择CAST('2016-01-14 23:59:59.999'作为日期时间),CAST('2016-01-14 23:59:59.998'作为日期时间)
=>
2016-01-15 00:00:00.000 2016-01-14 23:59:59.997
这是正确的,尽管我认为这比这里需要的更准确。除了毫秒差异,基本上其中一个包含一整天,而另一个不包含。如果类型为
datetime
2016-01-14 23:59:59.999
将相当于
2016-01-15 00:00:00.000
,因为
datetime
只有1/300秒的分辨率<代码>选择CAST('2016-01-14 23:59:59.999'作为日期时间),CAST('2016-01-14 23:59:59.998'作为日期时间)
=>
2016-01-15 00:00:00.000 2016-01-14 23:59:59.997
这是正确的,尽管我认为这比这里需要的更准确。除了毫秒差,基本上其中一个包括一整天,而另一个不包括。
2016-01-01 <= date and date < 2016-01-02