如何在ODBC本机客户端中获取SQL Server DateTime2字段
我有一张如下所示的桌子如何在ODBC本机客户端中获取SQL Server DateTime2字段,sql,sql-server,odbc,client,Sql,Sql Server,Odbc,Client,我有一张如下所示的桌子 CREATE TABLE [dbo].[MyTable]( [tagname] [nvarchar(30)] NOT NULL, [date] [datetime2] NOT NULL ) 我在C++中使用客户端下面的代码来获取标签日期< /p> TIMESTAMP_STRUCT ts; SQLLEN cbhiredate; if (!SQL_SUCCEEDED(SQLGetData(hStmt, 2, SQL_C_TIMESTAMP, &ts,
CREATE TABLE [dbo].[MyTable](
[tagname] [nvarchar(30)] NOT NULL,
[date] [datetime2] NOT NULL
)
我在C++中使用客户端下面的代码来获取标签日期< /p>
TIMESTAMP_STRUCT ts;
SQLLEN cbhiredate;
if (!SQL_SUCCEEDED(SQLGetData(hStmt, 2, SQL_C_TIMESTAMP, &ts, sizeof(TIMESTAMP_STRUCT), &cbhiredate)))
在大多数情况下,它工作正常,但在某些情况下,日期毫秒值正在四舍五入。例如,如果SQL表中的日期值为2020/01/11 17:15:38.6850000,则在使用上述查询进行获取时,客户端代码中的日期值将更改为2020/01/11 17:15:38.686
从SQL server获取数据时是否有任何错误。SQL Server 2012 SP4出现这种情况。问题在于datetime2数据类型的精度为100ns,而您将该值放入的类型的精度为毫秒 如果实际日期/时间值为2020/01/11 17:15:38.685900,则必须将其四舍五入到.686。如果实际值是.685400,它将四舍五入到.685
如果将数据类型更改为datetime2(3)-它将以毫秒的精度存储在SQL Server中,并且不会对值进行任何舍入。SQL Server中的确切值为2020/01/11 17:15:38.6850000,因此,从外部客户端提取时,不应对其进行舍入。但它仍然在发生。因此,SQL server或客户端代码可能有问题。如果您完全确定SQL server.6850000中的值,则一定是其他原因导致舍入。我仍然会将SQL Server中的数据类型更改为datetime2(3)-这将精确到毫秒,并避免任何舍入问题。