Sql server 如何在SQLServer2008中从今天开始获取一个月前的数据?

Sql server 如何在SQLServer2008中从今天开始获取一个月前的数据?,sql-server,sql-server-2008,Sql Server,Sql Server 2008,我正在写一个查询,其中我得到了上个月的时间,但时间为零(如果今天是2013-05-21,那么我想得到2013-04-21 00:00:00.000) 所以我试着: select (dateadd(month,datediff(month,(0),getdate())-1,(0))); 但是我得到了上个月的第一天 然后我试着: select dateadd(month, -1, GETDATE()); 我得到了正确的日期,但我也得到了当前时间(2013-04-21 11:41:31.090),

我正在写一个查询,其中我得到了上个月的时间,但时间为零(如果今天是2013-05-21,那么我想得到2013-04-21 00:00:00.000)

所以我试着:

select (dateadd(month,datediff(month,(0),getdate())-1,(0)));
但是我得到了上个月的第一天

然后我试着:

select dateadd(month, -1, GETDATE());
我得到了正确的日期,但我也得到了当前时间(2013-04-21 11:41:31.090),我希望时间为零

那么,我的查询应该如何才能得到这样的结果:2013-04-21 00:00:00.000


提前感谢。

在SQL Server 2008中,有
日期
数据类型,它没有附加时间。因此,只需转换,然后执行
DateAdd
,就可以很容易地删除时间部分

SELECT DateAdd(month, -1, Convert(date, GetDate()));
这将返回一个
日期
数据类型。要再次强制将其设置为
datetime
,只需再添加一个
Convert

SELECT Convert(datetime, DateAdd(month, -1, Convert(date, GetDate())));
不过,您可能不需要显式转换为
datetime

注:“从今天起一个月前”可以用许多不同的方式定义。它在SQL server中的工作方式是返回上个月的日期,该日期与当前月份的日期最接近。这意味着在3月31日运行此表达式的结果将是2月28日。因此,如果您没有清楚地考虑到这一点的后果,您可能无法在某些场景中获得预期的结果,例如,如果您多次执行一个月的计算,期望在不同的月份中得到同一天(例如执行三月->二月->一月)

演示将显示每个表达式的值和结果数据类型。

尝试如下操作

   select Cast(Cast(dateadd(month, -1, GETDATE()) as Date) as Datetime);

你可以用这个,它很简单,对我有用-


选择SUM(amount)作为费用总额,其中MONTH(date)=MONTH(curdate())-1

获取上一个月的开始日期和结束日期

DECLARE @StartDate date;
    DECLARE @EndDate date;
    select @StartDate= DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE())-1, 0)
    select @EndDate= DATEADD(MONTH, DATEDIFF(MONTH, -1, GETDATE())-1, -1)

这是不好的,因为它不可搜索。只有在表中的每一行上运行一个函数,才能满足此查询。这对性能不好。最好使用两个表达式将范围括起来,并确保
date
列仅出现在每个比较的一侧,例如,
DECLARE@today-date=GetDate();从日期>=DateAdd(月-2,今天)和日期如果有索引,则可以使用日期索引。