his生成了WHERE子句,这样它就可以从索引中获益。由于您没有包含模式,我们只能猜测MyDate的数据类型。如果它包含时间,例如DATETIME,则您的分组依据可能应该包含一个CAST到DATE。谢谢zohar。不幸的是,我仅限于SQL server 2
his生成了WHERE子句,这样它就可以从索引中获益。由于您没有包含模式,我们只能猜测MyDate的数据类型。如果它包含时间,例如DATETIME,则您的分组依据可能应该包含一个CAST到DATE。谢谢zohar。不幸的是,我仅限于SQL server 2,sql,tsql,sql-server-2008-r2,Sql,Tsql,Sql Server 2008 R2,his生成了WHERE子句,这样它就可以从索引中获益。由于您没有包含模式,我们只能猜测MyDate的数据类型。如果它包含时间,例如DATETIME,则您的分组依据可能应该包含一个CAST到DATE。谢谢zohar。不幸的是,我仅限于SQL server 2008 r2。对不起,我真的应该在问题中提出,你需要加入逻辑来计算明天的最后一天是什么,否则你将无法得到整个月的结果。或者,你可以计算出下个月是什么时候,并将标准更改为
his生成了
WHERE
子句,这样它就可以从索引中获益。由于您没有包含模式,我们只能猜测MyDate
的数据类型。如果它包含时间,例如DATETIME
,则您的分组依据
可能应该包含一个CAST
到DATE
。谢谢zohar。不幸的是,我仅限于SQL server 2008 r2。对不起,我真的应该在问题中提出,你需要加入逻辑来计算明天的最后一天是什么,否则你将无法得到整个月的结果。或者,你可以计算出下个月是什么时候,并将标准更改为WHERE
子句可以从索引中受益。由于您没有包含模式,我们只能猜测MyDate
的数据类型。如果它包含时间,例如DATETIME
,则您的分组依据
可能应该包含一个CAST
到DATE
。谢谢zohar。不幸的是,我仅限于SQL server 2008 r2。对不起,我真的应该把这个问题提出来
SELECT COL1, MyDate
FROM [dbo].[MyTable]
WHERE MONTH([MyDate]) >= @fromMonth
AND MONTH([MyDate]) <= @toMonth
AND YEAR([MyDate]) >= @fromYear
AND YEAR([MyDate]) <= @toYear
GROUP BY COL1, MyDate
DECLARE @FromDate datetime, @ToDate datetime
SELECT @FromDate = DATEFROMPARTS(@fromYear, @FromMonth, 1),
@ToDate = EOMONTH(DATEFROMPARTS(@ToYear, @ToMonth, 1)),
SELECT COL1, MyDate
FROM [dbo].[MyTable]
WHERE [MyDate] >= @FromDate
AND [MyDate] <= @ToDate
GROUP BY COL1, MyDate
DECLARE @FromDate datetime, @ToDate datetime
SELECT @FromDate = CAST(CAST(@FromYear * 10000 + @FromMonth * 100 + 1 as char(8)) as date),
@ToDate = DATEADD(MONTH, cast(CAST(@ToYear * 10000 + @ToMonth * 100 + 1 as char(8)) as date))
SELECT COL1, MyDate
FROM [dbo].[MyTable]
WHERE [MyDate] >= @FromDate
AND [MyDate] < @ToDate
GROUP BY COL1, MyDate
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' );
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;
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;