查询 SQL 服务器的 MS Access Date() 语法

MS Access Date() syntax in query to SQL Server

我找到了几篇关于在 Access 前端 VBA 过程中使用 GETDATE() 函数用于 SQL 服务器链接 table 的帖子。这些帖子都集中在查询的 WHERE 子句上,但我一直无法找到有关使用 GETDATE() 进行列分配的相应信息。

例如,我知道在 WHERE 子句中,我会使用这样的东西:

WHERE MyDate = CAST(GETDATE() AS DATE)

但是,当我尝试将当前日期分配给列时,VBA 中出现语法错误,如下所示:

INSERT INTO MyTable ( SomeValue, TheDate ) SELECT 'Widget' AS Expr1, CAST(GETDATE() AS DATE) AS Expr2;

在此示例中,TheDate 在 SQL 服务器中定义为 DateTime。像这样写,VBA 报告“查询表达式 'CAST(GETDATE() AS DATE)' 中的语法错误(缺少运算符)。我试图用 Access-friendly #date 分隔符包围表达式,但没有成功。

在 SQL 中花了大约 30 分钟搜索 stackexchange.com MS Access Date() 的各种方法后,我一直无法找到它。然而,它是如此简单,我相信它已经在某个地方得到了回答。

如果您 运行 在链接 table(不是 PT 查询)上的 Access 中,它应该显示为:

INSERT INTO MyTable ( SomeValue, TheDate ) 
VALUES ('Widget', Date());

在 MS Access 中,您可能(不是 100% 确定链接 SQL,您必须试验)应该使用 Now()Date() 函数。第一个相当于 SQL 中的 getdate(),第二个 returns 当前日期没有时间。

这里似乎有些混乱。如果您构建 Access 查询,那么 SQL 服务器日期函数和语法的零零。您的 SQL 必须继续写入访问标准,除非您使用 pass-though 查询。

然而,我在这里看到了 100 次。 sql 服务器端的数据类型是什么? 是 datetime 还是 datetime2?

以及双倍、三倍、四倍(以及更多)在设计模式下检查 linked table。

如果您link到SQL服务器使用标准的遗留“SQL服务器”驱动程序。从windows98SE开始出货20年的那个?

您必须检查 Access 是否将这些列视为文本或日期列(如果需要,在 Access 中始终允许时间部分)。

如果您将该数据从 Access 迁移到 SQL 服务器和 link table,那么访问代码、查询、表单和所有内容都应该需要零更改。再次:零零变化。

但是,如果您在 SQL 服务器端使用 datetime2 呢?那么当 linking table 时,您不能使用旧的“SQL 服务器驱动程序”。原因是他们不支持较新的 datetime2 格式。因此,Access 实际上会将该列作为文本列查看、使用和处理。你真的,但真的不希望这种情况发生。 为什么? 因为接下来你会花下一周的时间在 SO 上询问有关某些日期代码或列或查询如何不起作用的问题。 再次: Access 中需要零零更改。如果您的日期开始中断,那么问题不是日期格式,而是该列现在被访问视为 TEXT 数据类型。

解决方法: 将 sql 侧 datetime2 列更改为 datetime,然后 re-link.

或 re-link 您的 table 使用较新的本机 11(或更高版本 - 现在最多 18)。这样,Access 将 see/use/process datetime2 作为 Access 中的正确日期格式。

所以,在你做任何事情之前?在设计模式下打开一个 Access tables linked to SQL 服务器。 (忽略只读提示)。现在,查看分配给日期列的数据类型。如果它们是文本,那你就乱七八糟了。

您需要re-link使用较新的 ODBC 驱动程序。

如果您使用 linked table 到 sql 服务器,则应修改甚至更改现有代码 sql 和要求。但是话又说回来,如果您 linked 使用了错误的 SQL ODBC 驱动程序,那么 Access 将无法看到也无法将这些 datetime2 列作为日期进行处理 - 它将使用文本,而且您真的不想这样做允许这种情况发生。

总结: 任何日期代码、SQL 更新、排序、查询、VBA 代码、表单代码、报告应继续使用零更改。如果您在迁移后更改日期,那么您做错了,并且这些日期列不会被访问视为日期列。

要么删除所有 datetime2 列,然后 re-link(将服务器端更改为日期时间)。或者 re-link table 使用本机 11 或更高版本的 ODBC 驱动程序。这些选择中的任何一个都可以解决这个问题。

这是一个修复程序,需要零代码,并且对处理日期的 Access 进行零更改。