【问题标题】:Access sql query based on user provided date only returns dates with times = 0:00:00基于用户提供的日期的访问 sql 查询仅返回时间 = 0:00:00 的日期
【发布时间】:2019-04-16 18:34:55
【问题描述】:

没有找到任何密切相关的问题,所以这里。

这是我的查询的简单版本:

SELECT sampleID, beginDateTime
FROM sample
WHERE DateValue(beginDateTime) = [Enter sample date: ];

这不会返回任何记录,但应该根据我输入的日期返回 3。

然而,这个版本返回了我所期望的,所有与提供的日期和它们各自的时间相匹配的记录。

SELECT sampleID, beginDateTime
FROM sample
WHERE DateValue(beginDateTime) = #2015-5-18#;

如何启用在 Access SQL 中格式正确的用户提示,以返回适当的记录?注意:我不知道 VBA。

还尝试添加PARAMETER = beginDateTime DateTime; 这似乎返回了所有记录并为它们分配了提示用户输入的所有日期。

尝试在参数列表中使用 DateValue:

SELECT sampleID, DateValue(beginDateTime)
FROM sample
WHERE beginDateTime = [Enter sample date: ];

这仅返回日期 = 0:00:00

我希望我的查询提示用户输入日期(没有时间),并返回具有该日期的所有记录及其各自的时间。

非常感谢您的帮助。提前致谢。

【问题讨论】:

    标签: sql date ms-access prompt


    【解决方案1】:

    基于@Gustav 的使用类型化参数的建议(这具有 Access 将拒绝无效日期的额外好处):

    PARAMETER [Enter sample date: ] DateTime;
    SELECT sampleID, beginDateTime
    FROM sample
    WHERE beginDateTime >= [Enter sample date: ] and beginDateTime < ([Enter sample date: ]+1)
    

    这样可以避免对表达式进行过滤,这会禁用索引使用,因此在大型数据集上会很慢。


    编辑:要在界面中实现这一点,只需在设计视图中打开查询,然后转到设计、参数,然后输入参数的名称和数据类型。 p>

    【讨论】:

    • @Abby,参数化查询比使用字符串连接更安全,因为字符串连接容易受到 SQL 注入攻击。只有当您的数据库公开可用时,SQL 注入才是真正值得关注的问题。由于您已经在使用输入框,因此我刚刚修复了您的示例。它并不比你现有的风险更大。使用参数化查询是一个好习惯,但并非总是绝对必要的。
    • @Abby:在最简单的级别,用户可以打错字并输入“非日期”值,然后您的CDate 将失败。通过将您的参数定义为日期,任何“非日期”都将被拒绝。更不用说查询会运行得更快。
    【解决方案2】:

    使用正确的语法指定参数:

    PARAMETERS [Enter sample date: ] DateTime;
    SELECT sampleID, beginDateTime
    FROM sample
    WHERE DateValue(beginDateTime) = [Enter sample date: ];
    

    然后它将接受根据您当前 Windows 设置的格式输入的日期。

    【讨论】:

    • +1 建议使用类型化参数。不是什么好主意:如果效率很低,就过滤表达式。
    • 因此,使用 PARAMETER 并且还包括用户提示的建议返回提示用户两次。
    • 我们只有您的查询,而不是您使用的方式和地点。参数只会提示一次。
    【解决方案3】:

    您可以尝试将输入框返回的值转换为日期:

    SELECT sampleID, beginDateTime
      FROM sample
     WHERE DateValue(beginDateTime) = CDate([Enter sample date: ]);
    

    【讨论】:

    • 与@Gustav 的回答相比,这有风险且效率较低
    • 谢谢,巨石。有没有办法将此语法合并到表单调用的查询中?或者这是题外话?我在sql查询中尝试了 DateValue([sample.beginDateTime])=([Forms]![Lab Replicate Query Form]![date_time]) 。并添加到我要运行查询的表单中,在 Control Source = CDate([beginDateTime]) 但不是运气。有什么建议?非常感谢您的帮助。
    • 我认为这将是一个新问题,其中包含有关您正在做什么的更多详细信息。
    猜你喜欢
    • 1970-01-01
    • 2013-07-12
    • 1970-01-01
    • 1970-01-01
    • 2014-01-05
    • 2022-01-24
    • 2019-08-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多