因为,你没有给我们从你的表中的一些示例数据,我产生了我自己的。
CREATE TABLE #Temp
(
MyCol VARCHAR(10)
, MyDate DATETIME
);
INSERT INTO #Temp
(MyCol, MyDate)
VALUES ('A', GETDATE()),
('A', '2016-09-01'),
('B', '2016-09-03'),
('B', '2016-08-28'),
('A', '2017-03-01'),
('A', '2017-04-01');
让我们取一个日期(2016-09-01
)并将其分解。
您的WHERE
子句正在有效地测试第一行的以下条件。
9 >= 9
=>真
9 <= 3
=>假
2016 >= 2016
=>真
2016 <= 2017
=>真
因为你AND
-ing所有这些条件,你'不会返回你想要的结果。
您需要评估您的值为日期而不是数字,否则您会遇到这些问题。
你可以做这样的事情:
DECLARE @ToDate AS DATE = CONVERT(DATE, CONVERT(VARCHAR, @toYear) + '-' + CONVERT(VARCHAR, @toMonth) + '-1');
DECLARE @FromDate AS DATE = CONVERT(DATE, CONVERT(VARCHAR, @fromYear) + '-' + CONVERT(VARCHAR, @fromMonth) + '-1');
SELECT t.MyCol
, t.MyDate
FROM #Temp AS t
WHERE t.MyDate BETWEEN @FromDate AND @ToDate
GROUP BY t.MyCol
, t.MyDate;
这是一个很好的起点,但由于您提供的变量,你只能得到2016-09-01
到2017-04-01
而非2016-09-01
到2017-03-31
数据。
所以你需要增加一个月。你可以通过多种方法做到这一点(每月增加一个,并查看它是否超过13,DATEADD
等)
我选择了DATEADD
,因为它有点简单。
你最终的结果出现这样的:
DECLARE @ToDate AS DATE = DATEADD(MONTH, 1, CONVERT(DATE, CONVERT(VARCHAR, @toYear) + '-' + CONVERT(VARCHAR, @toMonth) + '-1'));
DECLARE @FromDate AS DATE = CONVERT(DATE, CONVERT(VARCHAR, @fromYear) + '-' + CONVERT(VARCHAR, @fromMonth) + '-1');
SELECT t.MyCol
, t.MyDate
FROM #Temp AS t
WHERE t.MyDate >= @FromDate AND
t.MyDate < @ToDate
GROUP BY t.MyCol
, t.MyDate;
编辑:有可能是生成日期比做级联和转换更清洁的方式。
哇哈哇,这是混乱。请查看其扩展的TSQL文档。你正在让自己的生活比现在更难,因为有命令可以轻松做到这一点。 – user7568042
你需要根据整个日期做标准。看看你的月份标准。数据中的月份必须大于9且小于3。你知道什么数字高于9且低于3? –
你能提供你的模式和样本数据吗? http://meta.stackoverflow.com/questions/333952/why-should-i-provide-an-mcve-for-what-seems-to-me-to-be-a-very-simple-sql-query –