2017-09-02 257 views
0

我有这个疑问在SQL Server:SQL Server日期时间筛选查询

此查询的
SELECT 
    [Order Date], SUM([Profit]) 
FROM 
    [sample].[dbo].[superstore] 
WHERE 
    [Order Date] BETWEEN '2012-06-21 00:00:00.000' AND '2012-09-21 23:59:59.999' 
GROUP BY 
    [Order Date] 
ORDER BY 
    [Order Date]; 

结果有纪录的2012-06-21 00:00:00.000

[订购日期],但与此查询

SELECT 
    [Order Date], SUM([Profit]) 
FROM 
    [sample].[dbo].[superstore] 
WHERE 
    [Order Date] BETWEEN '2012-06-21 00:00:00.000' AND '2012-09-21 23:59:59.998' 
GROUP BY 
    [Order Date] 
ORDER BY 
    [Order Date]; 

我没有得到这个记录。

SQL Server是否有任何缺少的属性?

提示:类型[Order Date]datetime

+0

' SQL Server中的DATETIME'具有3.33ms的精度,导致这些奇怪的四舍五入效应。建议使用SQL Server 2008中引入的'DATETIME2(n)','DATE'和'TIME' - 这些类型没有这种奇怪的准确性和舍入问题 –

回答

3

SQL Server日期/时间列的精度取决于确切的类型。在你的第一个,“0.999”正在四舍五入。

最安全的方法是避开between和时间成分,具有类似:

SELECT [Order Date] , sum([Profit]) 
FROM [sample].[dbo].[superstore] 
WHERE [Order Date] >= '2012-06-21' AND 
     [Order Date] < '2012-09-22' 
GROUP BY [Order Date] 
ORDER BY [Order Date]; 
1

使用BETWEEN操作日期范围起初似乎吸引人,但正如你发现了,这是一个头疼。如果你坚持以下格式,你会发现它不管日期/时间数据类型。

注:凡之间的逻辑> =和< =,我们的转移“的最后一天,到次日午夜

SELECT 
    [Order Date], SUM(Profit) 
FROM 
    sample.dbo.superstore 
WHERE 
    [Order Date] >= '2012-06-21' 
    AND [Order Date] < '2012-09-22' 
GROUP BY 
    [Order Date] 
ORDER BY 
    [Order Date]; 
2

使用下面的查询

SELECT 
    CAST([Order Date] AS date), 
    SUM([Profit]) 
FROM [sample].[dbo].[superstore] 
WHERE CAST([Order Date] AS date) BETWEEN '2012-06-21' AND '2012-09-21' 
GROUP BY CAST([Order Date] AS date) 
ORDER BY CAST([Order Date] AS date);