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];

此查询的结果记录了 [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

原文由 Babak 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 779
2 个回答

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];

原文由 Gordon Linoff 发布,翻译遵循 CC BY-SA 3.0 许可协议

使用下面的查询

 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);

原文由 satputenandkumar 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进