我尝试使用
SELECT * from Results
WHERE DATEDIFF(d,Date,getdate())<30
但它似乎有错误。
对于提交的每条记录,仅显示30天。我可以知道我的语法是否正确吗?
非常赞赏, 斯坦
答案 0 :(得分:13)
语法看起来没问题,但您可能需要“引用”Date
:
SELECT * from Results WHERE DATEDIFF(d, [Date], getdate()) < 30
您是否在结果中有一个名为Date的列?
BTW,无法使用索引,而这将:SELECT * from Results WHERE [Date] >= DATEADD(d, -30, getdate())
答案 1 :(得分:5)
首先,您(以及此主题中的大部分回复)都在混淆SQL变体。您在关于SQL Server的问题中没有说什么,但是,您正在获得有关使用SQL Server语法的建议(即GetDate())。
JohnFx的答案为您提供了正确的Jet SQL语法:
SELECT *
FROM results
WHERE ([Date] between DateAdd("d", -30, Date()) and Date())
但他也是正确的,在Access / Jet中命名一个字段“Date”真的很糟糕。可以使用以下方法改进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的数据库引擎。这个帖子中有很多错误的答案正是因为那些海报没有仔细阅读这个问题(从关键字中可以清楚地看出涉及的是什么数据库引擎)。
答案 2 :(得分:3)
试试这个:
SELECT *
FROM results
WHERE ([Date] between DateAdd("d", -30, Date()) and Date())
另一个单挑。在Access中命名字段“Date”通常是个坏主意。这是一个保留字,你必须在所有查询中使用括号[]。
答案 3 :(得分:2)
如果您使用的是Microsoft Access数据库,则获取当前日期的函数是 Date()而不是getdate()
(适用于SQL Server)。
答案 4 :(得分:0)
您的查询看起来很合理。您正在运行的错误是什么?
答案 5 :(得分:0)
您未将SQL Server指定为数据库。在Access中,DateAdd的语法是:DateAdd(“d”,1,“31-Jan-95”)。