1

当我使用以下代码时:

Dim cmd As New OdbcCommand("SELECT GETDATE()", oConn)
retVal = cmd.ExecuteScalar()

结果输出是:

8/1/2013 10:10:39 AM

当我直接在 Management Studio 中运行完全相同的查询时,我得到:

2013-08-01 10:10:39.317

当我检查我的计算机设置与它们匹配的 SQL Server 设置时。

任何人都知道我需要做些什么来确保它匹配?

具体来说,我在谈论日期格式的差异。

4

4 回答 4

5

如果您希望日期输出具有特定的字符串格式,那么您可以使用CONVERT()样式编号。例如:

SELECT CONVERT(CHAR(20), GETDATE(), 22),
       CONVERT(CHAR(23), GETDATE(), 21);

结果:

--------------------    -----------------------
08/01/13 10:53:54 AM    2013-08-01 10:53:54.943

但是,如果您将日期用于直接显示以外的其他用途,则仅在显示时应用该格式。对于所有其他目的,它应保持为日期时间类型,不应转换为字符串。

至于实际时间值的差异,目前尚不清楚您在说什么问题,但我怀疑您只是间隔半小时运行这些查询。如果它们在同一时间或大约同时运行,看起来服务器快了半小时 - 也许它在不同的时区,或者可能只是很多漂移,或者有人不想使用时间服务。您的应用程序不应该使用客户端的时间/时区,特别是如果它是分布式的 - 始终使用服务器上的时间。

于 2013-08-01T14:55:44.943 回答
1

日期没有格式。仅当您将日期转换为字符串时,格式才会起作用。使用的格式取决于谁进行转换:服务器还是客户端?

您的 VB.NET 查询从服务器返回一个日期,并在您将其写入控制台、表单或其他任何内容时将其转换为字符串。VB.NET 使用您程序的 CurrentCulture,其默认值来自当前用户的区域设置。

在 SSMS 中显示数据时,将使用 ISO 格式,因此在编辑数据时不会有歧义。

当您在查询中比较日期和字符串值时,无论是通过将日期转换为字符串显式地还是因为您刚刚键入而隐式地比较MyDate = '13/1/2013,都会使用列的排序规则进行转换。排序规则是继承的,因此列的排序规则与数据库的排序规则相同。

于 2013-08-02T08:50:07.090 回答
0

尝试这个:

net time \\SERVER_NAME

注意:显然SERVER_NAME是您的 SQL Server 机器的名称。

你看到那次通话的结果有 30 分钟的差异吗?

于 2013-08-01T14:53:36.387 回答
-3

我更深入地查看了代码,发现一些有进取心的人在稍后的过程中将代码添加到了一行 SQL 中,这迫使该查询采用 DMY 格式。

因此 VB 中的代码在应用程序机器上返回正确的日期。这意味着我的电脑和app机器之间一定是有区别的。

另一位编码员遇到了同样的问题,因此解决方案是将以下代码添加到从数据库中提取的 SQL 中。

设置日期格式 dmy

这会强制 SQL 使用 DMY 格式...我删除了这段代码 编译并从服务器机器运行 EXE,我的问题就解决了!

感谢大家的帮助。

于 2013-08-01T17:19:02.747 回答