7

我正在写一个查询,我得到了上个月,但时间为零(如果今天是 2013 年 5 月 21 日,那么我想得到 2013 年 4 月 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

提前致谢。

4

4 回答 4

26

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

SELECT DateAdd(month, -1, Convert(date, GetDate()));

这将返回一个date数据类型。要强制它datetime再次出现,您可以简单地再添加一个Convert

SELECT Convert(datetime, DateAdd(month, -1, Convert(date, GetDate())));

不过,您可能不需要显式转换为datetime

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

在 SQL Fiddle 上查看现场演示

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

于 2013-05-21T16:46:07.337 回答
4

试试这样。。

   select Cast(Cast(dateadd(month, -1, GETDATE()) as Date) as Datetime);
于 2013-05-21T16:47:38.187 回答
1

你可以使用它,它非常简单并且对我有用 -

SELECT SUM( amount ) AS total FROM expenses WHERE MONTH( date ) = MONTH( curdate() ) -1

于 2015-09-24T07:29:14.557 回答
0

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

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)
于 2020-12-09T13:18:30.723 回答