【问题标题】:SQL Server datetime2 and ODBCSQL Server datetime2 和 ODBC
【发布时间】:2014-04-30 06:51:22
【问题描述】:

根据MSDN documentationdatetime2 的范围从 0001-01-019999-12-31。它还说 ODBC 字符串文字如下所示:

{ ts 'yyyy-mm-dd hh:mm:ss[.fractional seconds]' }

为什么最后三个语句失败了?仅当值大于 1753-01-01 且未使用 ODBC 语法时,它们才会成功。

CREATE TABLE Book (Id INTEGER IDENTITY NOT NULL, ReleasedOn DATETIME2)

INSERT INTO Book VALUES ('0001-01-01 00:00:00')
INSERT INTO Book VALUES ('0501-01-01 00:00:00')
INSERT INTO Book VALUES ('1752-12-31 00:00:00')
INSERT INTO Book VALUES ('1753-01-01 00:00:00')
INSERT INTO Book VALUES ('1902-09-17 00:00:00')


SELECT * FROM Book WHERE ReleasedOn = {ts '1753-01-01 00:00:00'} -- OK
SELECT * FROM Book WHERE ReleasedOn = {ts '1902-09-17 00:00:00'} -- OK

SELECT * FROM Book WHERE ReleasedOn = '0001-01-01 00:00:00' -- OK
SELECT * FROM Book WHERE ReleasedOn =' 0501-01-01 00:00:00' -- OK
SELECT * FROM Book WHERE ReleasedOn = '1752-12-31 00:00:00' -- OK

SELECT * FROM Book WHERE ReleasedOn = {ts '0001-01-01 00:00:00'} -- Error
SELECT * FROM Book WHERE ReleasedOn = {ts '0501-01-01 00:00:00'} -- Error
SELECT * FROM Book WHERE ReleasedOn = {ts '1752-12-31 00:00:00'} -- Error

-- Error:
-- Server: Msg 241, Level 16, State 1, Line 1
-- Conversion failed when converting date and/or time
-- from character string.

【问题讨论】:

  • 您很可能需要更新 ODBC 驱动程序
  • 我使用 SQL Server Native Client 11.0 版本 2011.110.3000.00。那么有一个更新的版本可以处理更小的日期时间吗?
  • 当我在小提琴中检查这个时,我发现提供的值似乎导致了一些问题(忽略第 4 次选择的错字)。见sqlfiddle.com/#!3/a1e1c/7
  • @Turophile 固定的小提琴语句仍然抛出相同的错误rextester.com/UNEJ79471

标签: sql sql-server odbc datetime2


【解决方案1】:

根据MSDN

SQL Server always treats ODBC data as being of the datetime data type.
*Conversion Notes*
1.ODBC string literals are mapped to the datetime data type. Any assignment 
  operation from ODBC DATETIME literals into date, time, datetime2, or datetimeoffset
  types will cause an implicit conversion between datetime and these types as 
  defined by the conversion rules.

Datetime 数据类型的日期范围是:

January 1, 1753, through December 31, 9999

这就是为什么在最后 3 个语句中使用 ODBC 字符串文字时 SQL 服务器会引发错误的原因,因为它会隐式转换为数据类型 Datetime 而不是 Datetime2 并且提供的值可能超出范围值对于 Datetime 数据类型,因此会出现错误。

希望对你有帮助!!!

【讨论】:

  • 谢谢。我可以不使用 ODBC 语法来解决这个问题。
猜你喜欢
  • 1970-01-01
  • 2019-10-07
  • 2015-12-30
  • 1970-01-01
  • 1970-01-01
  • 2010-11-22
  • 2020-04-09
  • 1970-01-01
相关资源
最近更新 更多