3

我试着用

SELECT * from Results
WHERE DATEDIFF(d,Date,getdate())<30

但这似乎有错误。

对于提交的每条记录,只会显示 30 天。我可以知道我的语法是否正确吗?

非常感谢,斯坦

4

6 回答 6

13

语法看起来不错,但您可能需要 'quote' Date

SELECT * from Results WHERE DATEDIFF(d, [Date], getdate()) < 30

您在结果中有一个名为日期的列吗?

顺便说一句,这将无法使用索引,而这将:

SELECT * from Results WHERE [Date] >= DATEADD(d, -30, getdate()) 
于 2009-03-02T03:35:58.253 回答
6

首先,您(以及该线程中的大多数回复)正在混淆 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。在这个帖子中发现了很多错误的答案,正是因为那些发布者没有仔细阅读问题(从关键字中很清楚涉及到什么数据库引擎)。

于 2009-03-02T23:29:38.727 回答
3

尝试这个:

SELECT *  
FROM results 
WHERE ([Date] between DateAdd("d", -30, Date()) and Date())

另一个单挑。在 Access 中将字段命名为“日期”通常不是一个好主意。这是一个保留字,您必须在所有查询中使用方括号 []。

于 2009-03-02T17:12:37.667 回答
2

如果您使用的是 Microsoft Access 数据库,则获取当前日期的函数是Date()而不是getdate()(用于 SQL Server)。

于 2009-03-02T04:06:49.537 回答
0

您没有将 SQL Server 指定为您的数据库。在 Access 中,DateAdd 的语法为:DateAdd("d", 1, "31-Jan-95")。

于 2009-03-02T23:25:55.803 回答
0

您的查询看起来不错。您遇到的错误是什么?

于 2009-03-02T03:35:27.723 回答