簡體   English   中英

SQL Server datetime2和ODBC

[英]SQL Server datetime2 and ODBC

根據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.

根據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

這就是為什么SQL服務器在最后3個語句中使用ODBC字符串文字時拋出錯誤的原因,因為它對數據類型Datetime而不是Datetime2了隱式轉換,並且提供的值超出了Datetime數據類型可能的范圍值,因此出現了錯誤。

我希望這有幫助!!!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM