我有一张桌子,上面有很多日期的记录。我想执行一个查询,该查询仅返回落在该日期月份的最后一天的记录。就像是:
SELECT * FROM mytable WHERE DATEPART(d, mytable.rdate) = DATEPART(d,DATEADD(m,1,DATEADD(d, -1, mytable.rdate)))
除非这行不通,否则rdate参数的右边应该是dateadd返回正确比较的月份的最后一天。
rdate
dateadd
基本上有一种简洁的方法可以进行这种比较吗?等效于四分之一的终端也将非常有帮助,但无疑会更加复杂。
编辑:
本质上,我想检查给定的日期是否是它所属的月份(或季度)中的最后一个。如果是,请返回该记录。这将涉及一些函数来返回任何日期的月份的最后一天。例如lastdayofmonth('2013-06-10') = 30(因此该记录将不会返回。
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()和lastmonthofquarter()功能
lastdayofmonth()
lastmonthofquarter()
使用DateSerial函数可计算给定日期的月份的最后一天。
传递零作为第三个参数, 日 ,实际返回的最后日期 之前的 一个月。
rdate = #2013-7-24# ? DateSerial(Year(rdate), Month(rdate), 0) 6/30/2013
因此,要获取rdate月份的最后日期,请添加1到 month 参数。
1
? DateSerial(Year(rdate), Month(rdate) + 1, 0) 7/31/2013
您可能会怀疑这种方法将中断12月rdate,因为Month() + 1它将返回13。但是,DateSerial仍然可以应对。
Month() + 1
DateSerial
rdate = #2013-12-1# ? DateSerial(Year(rdate), Month(rdate) + 1, 0) 12/31/2013
如果要在Access应用程序会话中运行查询,则可以基于该方法构建VBA函数,并在查询中使用自定义函数。
但是,如果查询将从ODBC或OleDb连接到Access数据库运行,则该查询不能使用VBA用户定义的函数。在这种情况下,您可以DateSerial直接在查询中使用。
SELECT m.* FROM mytable AS m WHERE m.rdate = DateSerial(Year(m.rdate), Month(m.rdate) + 1, 0)
如果您rdate所有的值都将午夜作为时间成分,那应该可以。如果这些值包括其他时间,请使用DateValue。
DateValue
WHERE DateValue(m.rdate) = DateSerial(Year(m.rdate), Month(m.rdate) + 1, 0)