2017-04-20 45 views
0

我需要幫助來確定導致問題的原因。插入表格轉換失敗

create table ##temp 
( 
    city Varchar(100), 
    country Varchar(100), 
    region Varchar(30), 
    load_date datetime 
); 

insert into ##temp 
    select 
     a.city, 
     a.country, 
     '' as region, 
     a.load_date 
    from 
     table_1 a 

錯誤:

Conversion failed when converting date and/or time from character string.

負載日期例如:

2017-04-17 00:00:00.000 
2017-04-17 00:00:00.000 
2017-04-17 00:00:00.000 
2017-04-17 00:00:00.000 
2017-04-17 00:00:00.000 
+1

您正在使用什麼數據庫管理系統使用CASTCONVERT?請相應地添加標籤。 – Alfabravo

+0

你能舉一些例子數據嗎? – AlwaysData

+0

你可以嘗試用簡單的插入語句插入一行到表中嗎?然後在這裏提供插入語句,所以也許有人可以看到爲什麼插入失敗。 – AlwaysData

回答

0

我在SQL Server Management Studio上執行了完整的腳本,它運行時沒有發生任何錯誤。然而,隨着日期列可能

完整的SQL腳本

CREATE TABLE table_1 (
    city varchar(100), 
    country varchar(100), 
    region varchar(30), 
    load_date datetime 
) 

INSERT INTO table_1 
    VALUES ('Mumbai', 'India', 'West', GETDATE()) 

SELECT 
    * 
FROM table_1 

CREATE TABLE #temp (
    city varchar(100), 
    country varchar(100), 
    region varchar(30), 
    load_date datetime 
); 

INSERT INTO #temp 
    SELECT 
    a.city, 
    a.country, 
    a.region, 
    a.load_date 
    FROM table_1 a 

SELECT 
    * 
FROM #temp 
--select * from table_1 
DROP TABLE #temp 
0

有多種格式的SQL Server支持 - 看MSDN Books Online on CAST and CONVERT。這些格式中的大多數是,依賴於,因此您可以設置哪些設置 - 因此,這些設置可能會工作一些 - 有時不會。

解決這個問題的方法是使用(稍作改動)ISO-8601日期由SQL Server支持的格式 - 這種格式的作品總是 - 不管你的SQL Server的語言和日期格式設置。

ISO-8601 format由SQL Server支持有兩種形式:

  • YYYYMMDD只是日期(沒有時間部分);請注意:沒有破折號!,這非常重要! YYYY-MM-DD不是獨立於您的SQL Server中的dateformat設置,並將在所有情況下工作!

或:

  • YYYY-MM-DDTHH:MM:SS的日期和時間 - 這裏需要注意:這種格式破折號(但他們可以可省略),並固定T的日期和時間之間的分隔符你的部分DATETIME

這對SQL Server 2000及更新版本有效。

如果你使用SQL Server 或更新和DATE數據類型(僅DATE - !DATETIME),那麼你的確可以同時使用YYYY-MM-DD格式,將工作,也與在任何設置你的SQL Server。

不要問我爲什麼這整個話題如此棘手,有點令人困惑 - 這就是它的方式。但使用YYYYMMDD格式,對於任何版本的SQL Server以及SQL Server中的任何語言和dateformat設置,都應該可以。

爲SQL Server 和更新的建議是使用DATE如果你只需要日期部分,並DATETIME2(n)當你需要日期和時間。你應該嘗試啓動即使有可能

你的情況

所以,我敢肯定,淘汰DATETIME數據類型的一切工作都正常如果

  • 你改變load_date的數據類型在你的臨時表到datetime2(3)
  • OR:你改變你要導入到字符串的格式datetime2017-04-17T00:00:00.000