【问题标题】:Access SQL Date condition not working properly访问 SQL 日期条件无法正常工作
【发布时间】:2018-08-28 06:03:15
【问题描述】:

我正在尝试检索两个特定日期之间的记录。我从中检索记录的表中的日期以“dd/mm/yyyy”格式表示,我使用的条件表示相同。

我注意到我的代码没有按预期工作,我发现这是因为它以美国格式而不是欧盟格式读取日期。例如:

SELECT CodOpe, PV_Sensy, Cashflow_Date FROM Amort_Plans_Calc 
WHERE Cashflow_Date > #01/04/2018#  AND Cashflow_Date <= #01/10/2021#
AND CodOpe = "06340CMLIM00506007228378601";

返回错误的记录数。如果我使用此代码,它会返回正确的数字:

SELECT CodOpe, PV_Sensy, Cashflow_Date FROM Amort_Plans_Calc 
WHERE Cashflow_Date > #04/01/2018#  AND Cashflow_Date <= #10/01/2021#
AND CodOpe = "06340CMLIM00506007228378601";

我已经以正确的格式设置了所有字段。我试过在查询条件中使用 Format 函数:

SELECT CodOpe, PV_Sensy, Cashflow_Date FROM Amort_Plans_Calc 
WHERE Cashflow_Date > Format("01/04/2018", "dd/mm/yyyy") 
AND Cashflow_Date <= Format("10/01/2021", "dd/mm/yyyy") 
AND CodOpe = "06340CMLIM00506007228378601";

这个方法也没有用(它根本没有显示任何结果)。

另外考虑一下,我只是把它说得更简单,因为我的真实脚本需要条件中的 Dateadd 函数(因此我需要让 Access 正确读取日期)并且应该是这样的:

SELECT CodOpe, PV_Sensy, Cashflow_Date FROM Amort_Plans_Calc 
WHERE Cashflow_Date > Dateadd("m", 18, Format("01/04/2018", "dd/mm/yyyy")) 
AND Cashflow_Date <= Dateadd("y", 5, Format("10/01/2021", "dd/mm/yyyy"))
AND CodOpe = "06340CMLIM00506007228378601";

这个版本没有显示任何结果,但似乎我不能将主题标签放在 dateadd 函数之外。

我该如何解决这个问题?

提前致谢,

乔纳

【问题讨论】:

  • the records are expressed in the "dd/mm/yyyy" format 这是否意味着日期在文本列中?
  • 将格式功能(使用美国日期格式)应用于您的列而不是您的条件。

标签: sql date ms-access format conditional-statements


【解决方案1】:

假设这是一个日期列?

您的查询必须采用美国格式。月/日/年。

因此,您创建的任何 sql 字符串都必须使用上述格式。

但是,您很有可能收到来自用户的输入。在这种情况下,文本框的格式必须设置为日期,因此文本框将采用数据的数据类型。在这种情况下,您再次使用 format()。

所有日期都是“内部”格式。您可以在报告等中以任何方式显示它们。但是,如果您手动或在代码中构建 SQL 字符串,则必须使用 usa 格式。

您不能使用 Format("01/04/2018", "dd/mm/yyyy"),因为您提供的日期是 STRING,而不是日期类型。

鉴于您的区域设置,format(#01/04/2018#,"mm/dd/yyyy") 应该可以工作,但前提是您的区域设置为 dd/mm/yyyy。

因此,您可以(并且应该)将格式设置(美国)应用于您提供的任何日期类型。只需使用#04/01/2018#,就无需担心格式。

您没有解释如何提供日期(表单、代码、直接编辑 sql 等)。

因此你需要 dateadd("m", 18, #04/01/2018#)

您也可以使用:

Dateadd("m", 18, format(#04/01/2018#,"mm/dd/yyyy"))

因此,要么转储格式的使用,要么确保提供 DATE 类型(用 # 括起来的值)。然后将该格式转换为 mm/dd/yyyy。

【讨论】:

  • 鉴于您的区域设置,format(#01/04/2018#,"mm/dd/yyyy") 应该可以工作,但假设您的区域设置为 dd/mm/yyyy . 不,Albert,这行不通。格式必须是 ISO 格式 yyyy/mm/dd 或“反向”美国格式 mm/dd/yyyy
  • 感谢您的详细回复。日期来自其他数据,它们以欧洲格式表示,因此我需要使用它作为格式。无论如何,既然我已经理解了这个问题,我将通过 VBA 代码将输入日期转换为美国格式。非常感谢!
【解决方案2】:

我刚刚遇到了另一个与上述问题相关的问题。这次的问题是我必须在两个日期字段上加入两个表,它们都以欧盟格式表示:

SELECT A.Cashflow_Date, B.Calendar_Day FROM Amort_Plans_Calc A
INNER JOIN BD_Calendar B
ON A.Cashflow_Date = B.Calendar_Day;

这没有给出任何结果,即使应该出现许多具有相同日期的记录。但是,我发现了一种似乎确实有效的解决方法:

SELECT A.Cashflow_Date, B.Calendar_Day FROM Amort_Plans_Calc A
INNER JOIN BD_Calendar B
ON DateValue(A.Cashflow_Date) = DateValue(B.Calendar_Day);

这返回了正确数量的记录。你怎么看?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-11-16
    • 2013-10-02
    • 1970-01-01
    • 2021-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多