【问题标题】:Access query with date BETWEEN breaks when using parameters使用参数时访问日期 BETWEEN 中断的查询
【发布时间】:2021-03-28 23:30:37
【问题描述】:

我在访问中有一个 SQL 查询,它将获取计算日期介于两个值之间的所有记录。如果我对日期文字进行硬编码,例如:

SELECT *
FROM Table
WHERE DateAdd("d",-60,DateAdd("yyyy",65,[Table].[BirthDate])) Between #3/21/2021# And #3/27/2021#;

但是我需要对日期之间的日期进行参数化,以便用户可以输入它们:

SELECT *
FROM Table
WHERE DateAdd("d",-60,DateAdd("yyyy",65,[Table].[BirthDate])) Between [StartDate] And [EndDate];

但是,当我运行后一个查询并输入与前一个硬编码的完全相同的日期时,它开始将记录拉出介于范围之间。我试图输入像3/21/2021 这样的日期以及像#3/21/2021# 这样的日期文字,但都不起作用。后者根本不拉任何东西。

我还有一个表单,其中包含一些使用短日期格式的文本框,让用户可以选择查询的日期。它有同样的问题,即撤回不正确的记录。据我所知,这些记录都没有任何时间成分。

如何获取正确使用用户输入参数的日期?

【问题讨论】:

  • 自从我使用 Access 以来已经很久很久了,但认为日期仍然需要#? ...例如#[StartDate]#,虽然我可能是错的。
  • 好主意,但似乎不起作用。查询不会运行并抱怨这样的语法错误。
  • 这些参数对我有用。我从不使用动态参数化查询。我更喜欢 VBA 来构建过滤条件并应用于表单或报告。如果您必须使用动态参数,则应参考表单上的控件进行输入。无法验证通过弹出提示输入。 SQL 注入对于用户输入的输入来说是一个明确的风险。尽可能使用组合框和列表框。
  • 更正,没有错误但也没有得到正确的记录输出。我的其他 cmets 仍然适用。

标签: sql ms-access


【解决方案1】:

Access 不知道您的参数是什么数据类型,因此请在查询中指定:

PARAMETERS 
    StartDate DateTime,
    EndDate DateTime;
SELECT 
    *
FROM 
    Table
WHERE 
    DateAdd("d",-60,DateAdd("yyyy",65,[Table].[BirthDate])) Between [StartDate] And [EndDate];

【讨论】:

    【解决方案2】:

    用于过滤本机字段的参数 - 而不是计算的日期。但是,使用 CDate() 函数有效。

    SELECT *
    FROM Table
    WHERE DateAdd("d",-60,DateAdd("yyyy",65,[Table].[BirthDate])) 
          Between CDate([StartDate]) And CDate([EndDate]);
    

    但在我记得之前,我测试了将输入返回到生日范围的计算,这也有效。

    SELECT *
    FROM Table
    WHERE [BirthDate] Between DateAdd("d",60,DateAdd("yyyy",-65,[StartDate])) 
                          And DateAdd("d",60,DateAdd("yyyy",-65,[EndDate]));
    

    【讨论】:

      猜你喜欢
      • 2011-01-23
      • 1970-01-01
      • 2012-09-23
      • 1970-01-01
      • 2016-05-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多