Tsql 两个应该相同的T-SQL查询不相同

Tsql 两个应该相同的T-SQL查询不相同,tsql,Tsql,我有下面两个查询,据我所知,应该会产生相同的结果,但实际上它们产生的数字大不相同。为什么“中间”日期与指定这些日期的月份和年份不同? 这可能是什么原因造成的 SELECT [Account] , SUM([Amount]) AS [Amount] FROM [Table] WHERE [Account] = 'Specific Account' AND Month([Date]) = 5 AND Year([Date]) = 2015 GROUP BY [Account] 总和结果:-

我有下面两个查询,据我所知,应该会产生相同的结果,但实际上它们产生的数字大不相同。为什么“中间”日期与指定这些日期的月份和年份不同? 这可能是什么原因造成的

SELECT [Account]
    , SUM([Amount]) AS [Amount]
FROM [Table]
WHERE [Account] = 'Specific Account'
AND Month([Date]) = 5
AND Year([Date]) = 2015
GROUP BY [Account]
总和结果:-1500000

SELECT [Account]
    , SUM([Amount]) AS [Amount]
FROM [Table]
WHERE [Account] = 'Specific Account'
AND [Date] BETWEEN '2015-05-01' AND '2015-05-31'
GROUP BY [Account]
总成绩:35万

我需要第一个是正确的,因为我需要按月份和年份对结果进行分组,使用第二个查询会很麻烦

我最终需要的查询:

SELECT [Account]
    , Month([Date]) AS [Month]
    , Year([Date]) AS [Year]
    , SUM([Amount]) AS [Amount]
FROM [Table]
GROUP BY [Account]
    , Month([Date])
    , Year([Date]) 

尝试下面的第一个案例,您将获得更多的行

AND (Month([Date]) = 5 AND Year([Date]) = 2015)
而不是

AND Month([Date]) = 5 AND Year([Date]) = 2015
==更新==

我建议使用函数。您应该像下面这样修改您的查询

CONVERT(varchar(10),DATE_COLUMN,112) between '20150501' and '20150531'
将只包括31日的行,其中时间部分为午夜,并忽略一天的其余部分

您应该忘记之间的
,因为您不能将有效的字符串文字放在右侧,这样就可以正确地处理
datetime
smalldatetime
datetime2(0)…datetime2(7)
并使用

WHERE [Date] >= '2015-05-01' AND [Date] < '2015-06-01'
其中[Date]>='2015-05-01'和[Date]<'2015-06-01'

如果在“2015-05-01”和“2015-06-01”之间将其更改为
,会发生什么情况?
第二个查询也会生成-1500000。有趣的但这为我指明了正确的方向。库存调整显然发生在我们会计年度最后一天(5月31日)的最后一秒。唯一具有时间值的日期条目。我还以为这包括了最后一个呢。非常感谢!我现在需要找到一种排除调整的方法,因为两个查询现在都会产生我不想要的结果。是的,这就是我的想法。您可以在“2015-05-01”和“2015-05-31 23:59:59”之间尝试
,或者找到其他列,将条目标记为此类调整并将其排除。使用适当的软件(MySQL、Oracle、DB2等)和版本(例如
sql-server-2014
)标记数据库问题很有帮助。语法和特征的差异通常会影响答案。例如,如果您使用的是最新版本的SQL Server,则可能会有所帮助。
s相互关联,因此这不重要。我将标记这一个,因为它最接近问题所在。我在RBarry Young的答案中找到了答案。两者之间并不像我想象的那样包容。在我的例子中,这使得按月份和年份进行分组更加困难。
WHERE [Date] >= '2015-05-01' AND [Date] < '2015-06-01'