Ms Access 查询中的日期过滤(有趣)

Posted

技术标签:

【中文标题】Ms Access 查询中的日期过滤(有趣)【英文标题】:Date Filtering in Ms Access Query (Interesting) 【发布时间】:2018-08-02 03:17:33 【问题描述】:

它看起来像样品,但我找不到这是什么?

这是我想要的最终结果 =>

这是我的查询=>

 Select 
a.staffname,
a.staffno,
a.cntname 
From [Clisys] a 
where 
CDate([a.acdate]) <= #02/08/2018# and  
CntNo='H0128C' and 
[a.JobCode] like '1**/2018' and 
[a.acdate] is Not Null

但问题是当我这样选择时,我什么也得不到。但是当我改变 where 那样的原因时=>

 where 
    CDate([a.acdate]) <= #02/08/2019# and  
    CntNo='H0128C' and 
    [a.JobCode] like '1**/2018' and 
    [a.acdate] is Not Null

我得到了我想要的。但是为什么如果我选择 2018 不起作用?

【问题讨论】:

AcDate 列的数据类型是什么?如果是Date/Time,为什么要使用CDate 将其转换为已有的类型?如果不是,并且您可以控制数据库架构,则应将其更改为。如果您无法控制架构,那么我想您会被您所拥有的东西所困扰,但是,如果您还没有,您应该意识到这样的数据库设计是不好的,您应该避免自己做这样的事情未来。 【参考方案1】:

始终将日期处理为日期,而不是字符串,不是数字,没有例外。

当你编写 SQL 时,请使用正确的语法。日期值的文本表达式必须类似于 mm/dd/yyyy 或 yyyy/mm/dd。

您确实使用了 dd/mm/yyyy,因此您的日期被读取为 2018-02-08。所以使用:

CDate([a.acdate]) <= #2018/08/02#

您的查询将按预期运行。

【讨论】:

【参考方案2】:

我从这个答案Once again, year, month, day is better. 中得到了一个想法,所以我将日期格式更改为 2018/08/02,这是 工作!。

无论语言环境如何,默认的 Access SQL 日期格式是 毫米/日/年。如果您使用无效的日期格式,它将“有帮助”尝试 将其转换为您的有效日期。

因此,如果您使用“30/09/2008”,它会识别出您正在使用 dd/mm/yyyy,并适当地转换它。但是,像 '10/01/2008' 是一个有效的 mm/dd/yyyy 值,因此它不会 被转换,并被错误地存储,以防你真正的意思 dd/mm/yyyy....

解决方案是始终将您的日期值转换为 mm/dd/yyyy 在 Access SQL 语句中使用它们之前的字符串。你必须是一个 这里要小心,因为使用 VBA 日期格式掩码可能无法完全工作 正如您在非美国语言环境中所期望的那样(例如,“有帮助”的口译 “mm/dd/yyyy”为“本地化短日期格式”),所以请测试 请谨慎使用您的特定 Access/VBA 版本。

【讨论】:

你是如何将日期值放入 SQL 代码的?如果它不是硬编码的,那么无论如何你都应该使用参数,在这种情况下,格式是完全无关的。

以上是关于Ms Access 查询中的日期过滤(有趣)的主要内容,如果未能解决你的问题,请参考以下文章

查询不使用 MS-Access 中的日期条件进行拉取

为啥 MS-Access 中的 Teradata 查询比 SQL Server 更快

根据表单字段中提供的日期查询 MS Access 中的最新记录

MS Access 日期范围函数减慢查询速度

VBA 代码中的 MS Access SQL 查询

MS-Access 中的多个日期范围