我试着用
SELECT * from Results WHERE DATEDIFF(d,Date,getdate())<30
但它似乎有错误.
对于提交的每条记录,仅显示30天.我可以知道我的语法是否正确吗?
非常感谢,斯坦
语法看起来没问题,但您可能需要'引用' Date
:
SELECT * from Results WHERE DATEDIFF(d, [Date], getdate()) < 30
您在结果中有一个名为Date的列吗?
顺便说一句,这将无法使用索引,而这将:
SELECT * from Results WHERE [Date] >= DATEADD(d, -30, getdate())
首先,您(以及此主题中的大部分回复)都在混淆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的数据库引擎.这个帖子中有很多错误的答案正是因为那些海报没有仔细阅读这个问题(从关键字中可以清楚地看到涉及的是什么数据库引擎).