0

根据MSDN 文档 datetime2的范围从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.
4

1 回答 1

2

根据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 数据类型可能的值范围,因此会出现错误。

我希望这有帮助!!!

于 2014-04-30T08:18:07.000 回答