首先,您(以及该线程中的大多数回复)混淆了 SQL 变体。您在关于 SQL Server 的问题中什么也没说,但是,您收到了有关使用 SQL Server 语法(即 GetDate())的建议。
JohnFx 的回答为您提供了正确的 Jet SQL 语法:
SELECT *
FROM results
WHERE ([Date] between DateAdd("d", -30, Date()) and Date())
但他认为在 Access/Jet 中将字段命名为“日期”确实很糟糕,这也是正确的。 WHERE 子句可以通过以下方式改进:
WHERE (results.Date between DateAdd("d", -30, Date()) and Date())
但我不能肯定地说——我永远不会将字段命名为“日期”,所以永远不会遇到这种问题。
但可能有一个更简单的版本,因为 Jet 以整数部分表示日期,小数部分表示时间的格式存储其日期。因此,在处理日期(而不是周、月或季度)时,您可以直接对它们执行日期数学运算:
WHERE results.Date BETWEEN results.Date-30 AND Date()
这将为您提供与 JohnFx 的 DateDiff() 版本完全相同的结果,但不需要为每一行调用 DateAdd 函数。
关键是对 Jet 数据库使用正确的语法,这意味着 DateAdd() 的第一个参数是字符串值 ("d"),并且您不能使用 SQL Server 函数 (GetDate( )),但必须使用 Jet 的函数来实现相同的目的 (Date())。但是当你不需要时避免在你的 SQL 中使用 Jet/Access 函数也是一个好主意,这就是为什么我相信“results.Date-30”版本会比 DateAdd() 版本更好.
旁白:我真的希望那些发布涉及 SQL 的答案的人会密切关注提问者使用什么数据库引擎来执行 SQL。在这个帖子中发现了很多错误的答案,正是因为那些发帖人没有仔细阅读问题(从关键字中很清楚涉及到什么数据库引擎)。