如何使用 MS Access 和 OLEDB 比较 SQL 查询中字符串类型的日期

How to compare date in string type in SQL query using MS Access and OLEDB

我正在使用 MS Access 作为数据库并使用 OLEDB。在数据库中,我将日期存储为字符串。我无法以日期类型更改它们(我知道将日期作为日期而不是字符串使用会更容易,但我无法更改它。我也无法更改日期格式。)。 日期格式为 dd.mm.yyyy.DD.MM.YYYY.。我想做的是将用户输入的日期与数据库中的某个日期进行比较,但我 运行 遇到了问题。 我不知道用什么函数来转换字符串做日期和做比较。我尝试了 convertcastformatcdate 等。没有任何效果。也许我没有正确使用它,或者我只是不知道该怎么做。我在这里阅读了一些关于 Whosebug 的主题,解决方案对我不起作用,因为他们只是指导我查看文档,而我显然无法使其工作。

所以,假设我有用户键入的日期 23.07.2021. 和数据库中名为 move_date 的列,其中包含字符串键入的日期,并且我想获取之前具有 move_date 的所有记录用户输入日期。

我想 SQL 查询应该看起来像这样

SELECT * FROM table WHERE func("23.07.2021.") < func(move_date)

其中 func 应该是将字符串转换为特定格式的日期的函数。我只是找不到有效的功能。我想我可以用 # 框住用户输入的日期,这样它就变成了日期文字,但仍然不知道如何处理列。

感谢任何帮助。

在 Access SQL 中,您可以嵌套 ReplaceDateValue 以将 move_date 转换为可以解析的内容。这会进行两次替换,首先将前两个“.”替换为“/”,然后对其进行替换以去除最后一个“.”。最后,它解析为可以与比较运算符一起使用的日期。

在 C# 方面,您应该将用户输入的值转换为日期,然后将其作为参数:

SELECT *
FROM table
where @searchDate < DateValue(Replace(Replace(move_date, ".", "/", 1, 2), ".", "")) ;

我想这目前对我有用。我用各种示例进行了测试,但似乎无法找到这不起作用的示例。

SELECT *
FROM table
WHERE DateValue(Replace(Replace(\"{searchDate}\", \'.\', \'/\', 1, 2), \'.\', \'\')) < 
      DateValue(Replace(Replace(move_date, \'.\', \'/\', 1, 2), \'.\', \'\'))

searchDate 是字符串(到目前为止还没有解析)

如果有人能找到这不起作用的示例,请分享。

在查询中,将那些糟糕的文本日期转换为真实的 日期 值:

SELECT 
    *, 
    DateSerial(Mid(move_date, 7, 4), Mid(move_date, 4, 2), Mid(move_date, 1, 2)) As true_move_date 
FROM 
    table

现在,在您的代码中,将此查询称为带有搜索日期参数的查询,并使用您的条件扩展查询。此参数应传递一个正常的 DateTime 值。