当通过参数向存储过程提供日期时,我对日期使用哪种格式有点困惑。我原来的 VBA 语法使用 ADO Connection 对象来执行存储过程:

Set SentDetailRS = Me.ADOConnectionToIntegrity.Execute("dbo.s_SelectAggregatedSentDetailList '" & fCSQLDate(EffectiveDate) & "'", , adCmdText)

这对于我使用日期语法来说效果很好 yyyy-mm-dd 但是当另一个用户执行代码时,他们收到错误:13“类型不匹配”。

经过一些实验,我发现以格式提供日期 dd/mm/yyyy 为用户修复了此错误,但现在给了我错误!

无论日期的格式如何,使用带参数的命令对象执行存储过程都有效(我假设 ADO 负责幕后的格式化)。我认为使用格式 yyyy-mm-dd 可以与 SQL Server 通用吗?

我也很困惑为什么这个问题似乎是用户特定的?我注意到我在 SQL Server 上的默认语言是“英语”,而其他用户的默认语言是“英式英语”,这会导致问题吗?

我将 ADO 2.8 与 Access 2003 和 SQL Server 2000 一起使用,SQL Server 登录是通过 Windows 集成安全性进行的。

有帮助吗?

解决方案

请小心,不要相信 ADO 正在解决该问题。通用 SQL 日期格式为“YYYYMMDD”,而 SQL 和 ACCESS 的显示日期和将其转换为字符串的方式都会受到计算机区域设置的影响。

不要忘记日期分隔符在 Access 中是 #,而在 SQL 中是 '

我最好的建议是在将指令发送到服务器之前系统地将您的 Access #MM-DD-YYYY#(或类似的)转换为“YYYYMMDD”。您可以构建一个小函数,例如:

Public function SQLdateFormat(x_date) as string

SQLDateFormat = _
   trim(str(datePart("yyyy",x_date))) & _
   right(str(datePart("m",date)),2) & _
   right(str(datePart("d",date)),2)

   ''be carefull, you might get something like '2008 9 3'
SQLDateFormat = replace(functionSQLDateFormat," ","0")
   '' you will have the expected '20080903'

End function

如果您在将 INSERT/UPDATE 字符串发送到服务器之前没有以编程方式构建它,那么我会建议您将所有计算机的区域设置转换为托管 SQL 的计算机的区域设置。您可能还需要检查您的 SQL 服务器上是否有特定的日期格式(我不确定)。就我个人而言,我通过在将 SQL 指令发送到服务器。

其他提示

我猜想 fCSQLDate 函数是特定于文化的 - 即它将根据用户的区域设置解析日期。这就是你看到问题的原因。

无论如何,使用连接字符串的查询总是一个坏主意(注入攻击)。如果使用参数,效果会更好。

Access 使用 # 作为日期字段分隔符。格式应该是 #mm/dd/yyyy# 也许 #mm-dd-yyyy# 也可以正常工作。

抱歉,我不知道 mysql,但对于 oracle,我总是会明确说明我期望的格式,例如:“DD-MM-YYYY”,以避免(区域)日期格式问题

为什么不使用格式

dd mmm yyyy

只有一种方式可以解释它。

您可以使用 Date() 函数根据机器日期和时间设置返回通用日期。计算机上的区域设置将决定它在客户端的格式化方式。如果您将该字段保留为严格的日期时间字段,则客户端区域设置可以格式化日期。

进入服务器,使用 Date() 函数也应该可以工作(返回通用日期值)。

此外,在传递命令对象和参数时,请在查询中使用它们,以避免对字符串字段进行 SQL 注入攻击。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top