【问题标题】:MS Access SQL - select specified amount of rows older than specified datetimeMS Access SQL - 选择早于指定日期时间的指定行数
【发布时间】:2016-06-22 17:51:14
【问题描述】:

我在我的 C# 应用程序中使用 MS Access .mdb 数据库。数据库包含电子邮件消息(一行 - 一条消息)。

我需要获取指定数量的早于指定日期时间的消息。假设在 2012-02-01 12:00:00 之前有 30 条消息。我尝试了不同的查询,但它们都给了我错误。也试过TOP、LIMIT等语句:

"SELECT * FROM ( SELECT * FROM Mails WHERE (timeReceived < ?) )  LIMIT 0,30";

"SELECT * FROM Mails WHERE (timeReceived = ?) ORDER BY timeReceived DESC LIMIT ?";

等等

任何提示。

【问题讨论】:

    标签: c# sql ms-access


    【解决方案1】:

    你说你尝试过 TOP 子句,但它应该可以工作

    SELECT TOP 30 * FROM Mails WHERE timeReceived  < '2012-02-01 12:00:00' ORDER BY timeReceived DESC
    

    您必须考虑this

    top 指令不返回前 n 项,因为一项很容易被引导 相信。相反,它返回至少 n 个不同的项目,由 结果的顺序。

    编辑澄清:

    SELECT TOP 25
    FirstName, LastName
    FROM Students
    WHERE GraduationYear = 2003
    ORDER BY GradePointAverage DESC;
    

    http://office.microsoft.com/en-us/access-help/results.aspx?qu=top&ex=1&origin=HA010256402

    TOP 谓词不会在相等的值之间进行选择。在里面 前面的例子,如果高二十五和二十六 点平均值相同,查询将返回 26 条记录。

    所以,不,具有相同时间戳的行不会被跳过。但是如果第 30 条和第 31 条记录(根据 order 子句)具有相同的时间戳,则两者都将返回,您将获得 31 条记录。

    如果要强制返回 30 条记录,则需要在 Order By 中包含主键以区分绑定值:

    SELECT TOP 30 * 
    FROM Mails 
    WHERE timeReceived  < '2012-02-01 12:00:00' 
    ORDER BY timeReceived DESC, MailID ASC
    

    【讨论】:

    • 你的意思是,TOP 会跳过具有相同时间戳的行,只给我唯一的时间戳(不同)行?
    • 哦,好的,我明白了。这当然不是我所需要的,但至少我没有丢失任何数据。我正在尝试 PrimaryKey 技巧...
    • 好的,似乎工作正常。我收到了 2 条具有相同时间戳的消息,之前它给了我 1 个额外的结果。现在只提供我在 TOP 中声明的数量
    • @Val Cool:那么您应该考虑最适合您要求的accept the question
    • 我今天已经使用了一段时间的代码,它不能正常工作!假设你有一些消息被添加到数据库中,其时间戳早于之前的消息 - 如果您先按时间排序,然后按 messageId 排序,您将获得所需的确切 TOP 数量,但此集中的消息将按 messageId 排序,而不是按时间排序。结果,我的应用程序显示了正确数量的消息,但它们没有按时间顺序列出。我想,我将只使用 TOPORDER BY timeReceived DESC 的数量,并将删除应用程序代码中的所有额外消息。
    【解决方案2】:

    你可以试试这个 SQL:

    SELECT top 30 * FROM Mails WHERE timeReceived &lt; #2012-02-01#

    【讨论】:

    • 日期时间没有问题。我对 TOP 语句有疑问:/
    【解决方案3】:

    这应该有效(未经验证):

    SELECT top 30 * 
    FROM Mails 
    WHERE timeReceived < '2012-02-01 12:00:00'
    ORDER BY timeReceived desc
    

    【讨论】:

    • 好的,它有效!但我很惊讶,因为我很确定我之前尝试过类似的(如果不一样的话)并且它给了我一个错误:/
    • 好的,我还在查询的末尾添加了“ORDER BY timeReceived DESC”,否则它会给我比指定日期更早的消息,但不是截至该日期的最新消息。
    • 我将 TOP 数量设为参数 (" SELECT TOP ? * FROM Mails WHERE timeReceived &lt; ? ORDER BY timeReceived DESC";),它给了我之前遇到的错误:SELECT 语句包含拼写错误或丢失的保留字或参数名称,或标点符号不正确。参数为getMailsCommand.Parameters.Add("@p1", OleDbType.BigInt).Value = 30;
    • 是的,我刚刚尝试了一个简单的整数值:30 - ("@p1", OleDbType.Integer).Value = 30
    • 我已将查询拆分并在代码中插入参数:" SELECT TOP "+ amount.ToString() +" * FROM Mails WHERE timeReceived &lt; ? ORDER BY timeReceived DESC, msgId ASC";
    猜你喜欢
    • 2015-02-07
    • 2011-09-08
    • 2019-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多