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;