访问SQL - 给定两个日期,返回上一期间的日期

时间:2013-06-19 16:00:11

标签: sql ms-access

我需要查找前一时间段的日期 - 例如如果给定月份是1月13日至3月13日,我需要能够计算出前一个时期是10月12日到12月12日。或者如果日期是7月12日到6月13日,我需要提出7月11日到6月12日。所以基本上在x个月的时间段内,我需要返回完成月份的x个月的另一个时间段在指定的时间段之前。

该日期将始终是该月的第一天,因此2012年6月1日或2012年6月1日或2012年6月1日取决于您在世界的哪个位置。

此SQL查询有效,但是当我将其合并到左连接查询中时,似乎会导致问题(请参阅现有问题:Access 2007 - Left Join to a query returns #Error instead of Null

SELECT DATEADD("m",
1-(1+MONTH(QueryDates.EndDate)-MONTH(QueryDates.StartDate)+
    (12*(YEAR(QueryDates.EndDate)-YEAR(QueryDates.StartDate)))),
DATEADD("m",-1,QueryDates.StartDate)) AS StartDatePrevious, 
DATEADD("m",-1,QueryDates.StartDate) AS EndDatePrevious
FROM QueryDates;

从我坐的地方看起来有点疯狂,所以有更简单的方法来完成这项任务;或者SQL中是否有任何错误,以后可能会混淆Access?

2 个答案:

答案 0 :(得分:1)

这对你有什么用?我相信,这与你在查询中所做的一样,但是使用DateDiff函数会使它看起来不那么粗糙。 DateDiff告诉您(例如)2013年1月1日到2013年3月1日之间有2个月。因此,我们考虑的是3个月的跨度,因此我们从开始日期和结束日期减去3个月以获得上一个跨度:

SELECT DateAdd("m",DateDiff("m",EndDate,StartDate)-1,StartDate) AS StartDatePrevious
,DateAdd("m",DateDiff("m",EndDate,StartDate)-1,EndDate) AS EndDatePrevious
FROM QueryDates;

顺便说一句,除非我弄错了,我相信你打算说“......我需要能够计算出前一段时间是 10月12日 12月-12 ...“

答案 1 :(得分:0)

这里有一个更清洁的SQL。它假设StartDate始终是该月的第一天。

计算期间长度,并返回当前期间开始前一天结束的相同长度。

SELECT QueryDates.StartDate, 
       QueryDates.EndDate, 
       Dateadd("m", Datediff("m", [EndDate] + 1, [StartDate]), [StartDate]) AS 
       StartDatePrevious, 
       [StartDate] - 1                                                      AS 
       EndDatePrevious 
FROM   QueryDates;