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!