Jet/Access数据库的Getdate()等效函数。需要上个月的记录。

4

我在阅读其他发布的问题时发现了许多检索上个月记录的示例。我正在使用Visual Studio 2008查询生成器从Access mdb中检索记录,当我输入以下查询时,它会显示一个错误,即getdate不是有效的函数:

where [Transaction Date]     
   between dateadd(mm, datediff(mm, 0, dateadd(MM, -1, getdate())), 0)
       and dateadd(ms, -3, dateadd(mm, datediff(mm, 0, dateadd(MM, -1, getdate())) + 1, 0))

如何正确地从mdb中提取上个月的记录?

这是一个查询语句,但它给出的记录包括本月的记录,我只需要上个月的记录:

  SELECT
   [Product Code], [Description One], [Transaction Number], Quantity, [Sales Value], Cost, [Transaction Date], [Transaction Time], Department, [Type Code], Cashier, [Computer Name], [Customer Code]
  FROM
   [Product History] 
  WHERE
   ([Transaction Date] >= DATEADD('m', - 2, NOW()))

非常感谢您的帮助。

4个回答

3

在Access中,Getdate()的等价函数是Now()。


现在返回日期和时间,而Date仅返回日期,我认为对于这个查询来说,Date更合适。 - Fionnuala

1

我倾向于在Access中创建自定义函数来计算下个月的开始和结束日期以及其他常见日期。以下是一个示例函数,其中定义了下个月的开始和结束日期。

Public Function Common_dates_SQL(strCommon_date As String) As Date
On Error GoTo Error_trap:

Select Case strCommon_date

    Case "Start_Last_Month"
        Common_dates_SQL = Date - ((DateDiff("d", DateValue("01/" & DatePart("m", Date) & "/" & DatePart("yyyy", Date)), Date)) + 1)

    Case "End_Last_Month"
    Common_dates_SQL = (Date - ((DateDiff("d", DateValue("01/" & DatePart("m", Date) & "/" & DatePart("yyyy", Date)), Date)) + 1)) - (DatePart("d", Date - ((DateDiff("d", DateValue("01/" & DatePart("m", Date) & "/" & DatePart("yyyy", Date)), Date)) + 1)) - 1)

End Select
DoCmd.Hourglass False
Exit Function

Error_trap:
DoCmd.Hourglass False
MsgBox "An error happened in sub Common_dates, error description " & Err.Description, vbCritical, "FRapps"

End Function

完整的函数还包括季度/年份和其他常被要求的内容。

然后,您可以像这样在SQL查询中使用此函数。

SELECT tblFoo.*
FROM tblFoo
WHERE (((Created_date) Between Common_dates_SQL('Start_last_month') And Common_dates_SQL('END_last_month')));

用户定义函数确实会使查询变慢,对于日期而言并不是必需的。 - Fionnuala
我应该补充说明的是,我使用这些函数的大部分时间都在动态生成的SQL查询中,因此传递的SQL只是日期,而不是UDF。但是,我确实很少直接在SQL查询中使用它们,但我无法评论性能,因为我使用它们的唯一时间是用于小查询。 - Kevin Ross

1
WHERE
    DATEDIFF('m', [Transaction Date], DATE()) = 1

那样做可以行,但我认为如果你在Transaction Date列上建立索引,它将不会在此查询中使用,这可能导致查询性能不够优化。不过,我很乐意接受更正,但这绝对是我的经验。 - Kevin Ross

1
每个月的第零天是上个月的最后一天,这在Jet SQL和VBA中都适用。
上个月的结束:
 DateSerial(Year(Date()),Month(Date()),0)

上个月初:
 DateSerial(Year(Date()),Month(Date())-1,1)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接