1

我有一张包含许多日期记录的表格。我想执行一个查询,该查询仅返回该日期月份最后一天的记录。就像是:

SELECT * FROM mytable
WHERE DATEPART(d, mytable.rdate) = DATEPART(d,DATEADD(m,1,DATEADD(d, -1, mytable.rdate)))

除非这不起作用rdate,因为参数右侧的 应该是该月的最后一天,dateadd以便返回正确的比较。

基本上有没有一种简洁的方法来进行这种比较?四分之一的等价物也将非常有帮助,但无疑更复杂。

编辑:

本质上,我想检查给定日期是否是它所属月份(或季度)的最后一个日期。如果是,则返回该记录。这将涉及一些函数来返回任何日期的月份的最后一天。例如lastdayofmonth('2013-06-10') = 30(因此不会返回此记录。

编辑2:

对于返回属于该季度最后一天的记录的情况,它们需要类似于:

SELECT * FROM mytable
WHERE DATEPART('d', mytable.rdate) = lastdayofmonth(mytable.rdate)
  AND DATEPART('m', mytable.rdate) = lastmonthofquarter(mytable.rdate);

棘手的一点是lastdayofmonth()andlastmonthofquarter()函数

4

3 回答 3

2

使用DateSerial 函数计算给定日期该月的最后一天。

将零作为第三个参数day传递,实际上返回上个月的最后一个日期

rdate = #2013-7-24#
? DateSerial(Year(rdate), Month(rdate), 0)
6/30/2013 

因此,要获取该月的最后一个日期rdate,请添加1月份参数。

? DateSerial(Year(rdate), Month(rdate) + 1, 0)
7/31/2013 

您可能会怀疑这种方法会在 December 中中断rdate,因为Month() + 1会返回 13。但是,DateSerial仍然可以处理它。

rdate = #2013-12-1#
? DateSerial(Year(rdate), Month(rdate) + 1, 0)
12/31/2013 

如果您将从 Access 应用程序会话中运行查询,则可以基于该方法构建 VBA 函数,并在查询中使用自定义函数。

但是,如果查询将从 ODBC 或 OleDb 连接运行到 Access db,则查询不能使用 VBA 用户定义函数。在这种情况下,您可以DateSerial直接在查询中使用。

SELECT m.*
FROM mytable AS m
WHERE m.rdate = DateSerial(Year(m.rdate), Month(m.rdate) + 1, 0)

rdate如果您的值都包括午夜作为时间分量,那应该可以工作。如果这些值包括其他时间,请使用DateValue.

WHERE DateValue(m.rdate) = DateSerial(Year(m.rdate), Month(m.rdate) + 1, 0)
于 2013-07-24T14:49:15.717 回答
1

尝试这个。

SELECT * FROM mytable
WHERE DATEPART(d, mytable.rdate) = 
DATEADD(d, -1, DATEADD(m, DATEDIFF(m, 0, GETDATE()) + 1, 0))
于 2013-07-24T10:04:37.087 回答
1

试试这个,这是在测试MS Access

使用String Concatenation

SELECT * FROM mytable
WHERE 
DatePart('d',mytable.rdate) = 
DatePart('d',dateadd('m',1, "1/" & DatePart('m',mytable.rdate)  & "/" & DatePart('yyyy',mytable.rdate))-1);

不使用更新string concatenation

SELECT * FROM
(SELECT *,
DATEPART('d',DATEDIFF('m',0,mytable.rdate)+1,
DATEADD('m',1,
DATEADD('d',DATEDIFF('d',0,mytable.rdate)- DATEPART('d',mytable.rdate)+1,0))-1) as EOMonth
FROM mytable ) A
WHERE DATEPART('d',mytable.rdate) = DATEPART('d',EOMonth)
于 2013-07-24T10:25:14.090 回答