• Careful, that won't be guaranteed to be correct if the data is ever changed to datetime2 with a higher precision than datetime.

    Might as well use Jeff's, which will work regardless of the data type.

    DECLARE @PreviousMonthStart DATETIME

    DECLARE @PreviousMonthEnd DATETIME

    SET @PreviousMonthStart = DATEADD(m,DATEDIFF(m,0,GETDATE())-1,0);

    SET @PreviousMonthEnd = DATEADD(ms,-2,DATEADD(month, DATEDIFF(month, 0, GETDATE()), 0));

    PRINT @PreviousMonthStart;

    PRINT @PreviousMonthEnd;

    CREATE TABLE #MyTable (MyDate datetime2(3), some_string varchar(100));

    INSERT INTO #MyTable VALUES

    ('20160301 12:39:10.898','This one is fine.'),

    ('20160331 23:59:59.999','What about me? Sniff sniff');

    --This one is only guaranteed to return

    --correct results for datetime

    SELECT * FROM #MyTable

    WHERE MyDate >= @PreviousMonthStart

    AND MyDate < @PreviousMonthEnd;

    --Jeff's will always work

    SELECT * FROM #MyTable

    WHERE MyDate >= DATEADD(mm,DATEDIFF(mm,0,GETDATE())-1,0)

    AND MyDate < DATEADD(mm,DATEDIFF(mm,0,GETDATE()),0);

    DROP TABLE #MyTable;

    Cheers!