查询SQL Server的MS Access Date语法

问题描述

在Access前端VBA过程中,我发现了几篇关于将GETDATE()函数用于sql Server链接表的文章。这些帖子主要关注查询的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 Server中定义为DateTime。这样写,VBA报告“查询表达式'CAST(GETDATE()AS DATE)中的语法错误(缺少运算符)'。我试图用可访问访问的#日期分隔符括住该表达式,但没有运气。

花了大约30分钟的时间以各种方式在sql搜索stackexchange.com上的MS Access Date()之后,我一直找不到。但是,它是如此简单,我相信它已经在某个地方得到了回答。

解决方法

在MS Access中,您可能应该使用Now()Date()函数(不一定100%肯定要对链接的SQL进行实验)。第一个等效于SQL中的getdate(),第二个返回不带时间的当前日期。

,

如果在Access中对链接表(而不是PT查询)运行此命令,则应显示为:

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

这里似乎有些混乱。如果您构建一个Access查询,则SQL Server日期函数和语法的ZERO ZERO为零。除非您使用传递查询,否则您的SQL必须继续按照Access标准编写。

但是,我在这里看到了100倍。 sql server端的数据类型是什么? 是datetime还是datetime2?

然后,在设计模式下,双击,三重,qudadropes(以及更多)检查链接表。

如果使用标准旧版“ SQL Server”驱动程序链接到SQL Server。自Windows 98SE以来已经出货20年了?

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

如果将数据从Access迁移到SQL Server并链接表,则访问代码,查询,表单和所有内容都需要零更改。再次:零零变化。

但是,如果您在SQL Server端使用了datetime2?然后,在链接表时,您将无法使用旧版“ SQL Server驱动程序”。原因是它们不支持较新的datetime2格式。结果,Access实际上将看到,使用和处理该列作为文本列。您确实,但确实不希望这种情况发生。 为什么? 因为然后您花了下个星期在SO上询问一些日期代码或列或查询如何不起作用的问题。 再次: 零需要在Access中进行更改。如果您的日期开始中断,那么问题不在于日期格式,而是现在可以通过访问将其视为TEXT数据类型。

解决方案: 将sql端的datetime2列更改为datetime,然后重新链接。

或 使用较新的本机11(或更高版本-现在最多18)重新链接表。这样,Access将在Access中看到/使用/处理datetime2为正确的日期格式。

那么,在您做什么之前?在设计模式下打开链接到SQL Server的Access表之一。 (忽略只读的prmompt)。现在,查看分配给日期列的数据类型。如果它们是文字,则说明您一团糟。

您需要使用较新的ODBC驱动程序重新链接。

如果您使用到sql server的链接表,应该触摸甚至更改现有代码,sql和quires的零。但是再说一次,如果您使用错误的SQL ODBC驱动程序进行链接,则Access无法查看或将那些datetime2列作为日期进行处理-它将使用文本,并且您实际上不希望允许这种情况发生。

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

清除所有datetime2列,然后重新链接(将它们在服务器端更改为datetime)。或使用本机11或更高版本的ODBC驱动程序重新链接表。这些选择中的任何一个都可以解决此问题。

此修复程序需要零代码,并且Access处理日期的更改为零。