SQL:如何仅显示 30 天的记录

Posted

技术标签:

【中文标题】SQL:如何仅显示 30 天的记录【英文标题】:SQL: How to display records for only 30 days 【发布时间】:2009-03-02 03:28:50 【问题描述】:

我尝试使用

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

但这似乎有错误。

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

非常感谢, 斯坦

【问题讨论】:

您是否遇到错误,或者您没有获得正确的值? 您使用的是什么 RDMS? 我正在使用 Microsoft Frontpage。 Microsoft Frontpage 不是 RDMS,甚至不是 RDBMS。它甚至不是一个好的 Web 开发系统。 【参考方案1】:

语法看起来不错,但您可能需要“引用”Date:

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

结果中有一个名为 Date 的列吗?

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

SELECT * from Results WHERE [Date] >= DATEADD(d, -30, getdate()) 

【讨论】:

是的。我有一个名为 Date 的 cloumn。感谢十亿。 你为什么要假设 SQL Server? 技术上这不是正确的答案,因为 OP(最终)提到这是一个 Access/Jet 问题。 我相信它最初没有被标记为 ms-access【参考方案2】:

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

【讨论】:

我错过了最初问题上的标签,这会导致我提供不同的语法。也就是说,是什么关键字让您知道它是 Jet SQL 语法? 嗨大卫,感谢您的洞察力和澄清。我应该提出一个更明确的问题,以避免给所有顾问造成任何混淆。我根据 Jets SQL 而不是 SQL 服务器功能重命名并更正了代码。现在可以了!非常感激。 =) “更好”在旁观者的眼中。我发现 DateAdd 版本更直观,因为时间颗粒 "d" = day 更明确。 如果“更好”意味着“性能优化”,则考虑将结果列设为表的 PRIMARY KEY 约束中第一个声明的列,以支持集群。 让我进入 Jet SQL 的是 MS Access 标记和 FrontPage 参考。没有人提到 SQL Server(“SQL”标签只是用于 SQL 问题的通用标签,不是吗?)。【参考方案3】:

试试这个:

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

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

【讨论】:

哦,我有义务补充。不要做“SELECT *”,列出你想要的特定字段。我的回复的语法只是一个例子,因为我不知道你需要哪些字段。【参考方案4】:

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

【讨论】:

【参考方案5】:

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

【讨论】:

连接失败。未定义函数'getdate'【参考方案6】:

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

【讨论】:

严格来说,在 Jet 中就是这样的语法。 Access 没有 SQL 语法——它只有 Jet SQL 语法。 '严格'?不,您松散地使用术语“Jet”来表示“Microsoft Jet 和 Microsoft Access Engine”。考虑到“Access”一词包含在严格的定义中,那么通俗地引用“Access SQL”是完全可以接受的,每个人都会知道它的含义。 很多人都这样做。但这会在讨论和许多没有区分他们的数据库引擎 (Jet) 和他们的开发平台 (Access) 的人的头脑中引起很多混乱。 问题是具有 Access 应用程序经验的人正在浪费时间查看 Access 标记的问题,例如“如何将 php 网站连接到 .mdb 文件?”访问与它无关。

以上是关于SQL:如何仅显示 30 天的记录的主要内容,如果未能解决你的问题,请参考以下文章

SQL查询仅显示一个具有多条记录的字段

如何在 Oracle SQL 中仅选择最近 30 天内第一次在表中显示的这些 ID?

Oracle SQL Where 子句查找超过 30 天的日期记录

如何将滚动 7 天和 30 天的列添加到我每天在 SQL Server 中的不同登录次数中

ASP 如何将新闻记录按每天记录数分段显示。并统计每天记录数,年月日分段显示 表news 代码如何写!

MS Access:Make Form仅显示最近48HS的记录