2012-10-18 72 views
81

我想用SQL查詢中插入一個datetime價值爲表(SQL Server)的下方SQL查詢來插入日期時間在SQL Server

insert into table1(approvaldate)values(18-06-12 10:34:09 AM); 

但我得到這個錯誤味精。 Incorrect syntax near '10'.

我試過用引號

insert into table1(approvaldate)values('18-06-12 10:34:09 AM'); 

我收到此錯誤信息Cannot convert varchar to datetime

請幫助! 謝謝。

回答

147

您將希望使用YYYYMMDD在SQL Server中進行明確的日期確定。

insert into table1(approvaldate)values('20120618 10:34:09 AM'); 

如果你嫁給了dd-mm-yy hh:mm:ss xm格式,您需要使用與特定風格的轉換。

insert table1 (approvaldate) 
     values (convert(datetime,'18-06-12 10:34:09 PM',5)); 

5這裏是意大利日期的風格。那麼,不只是意大利人,但這是它在Books Online歸因於的文化。

+1

謝謝。它的工作原理。順便說一句,是不是可以輸入DD-MM-YY格式? – Shee

+0

@RichardTheKiwi'5'代表什麼? – Shee

+0

@Shee see footer to answer – RichardTheKiwi

18

請參閱Microsoft TechNet中的String Literal Date and Time Formats部分。

您可以使用標準的ANSI標準SQL日期格式。根據上面的鏈接,它被標記爲「多語言」:

insert into table1(approvaldate) values ('2012-06-18 10:34:09') 

但是,這不適用於所有語言。例如,下面是使用動態SQL在sys.syslanguages定義的所有SQL語言測試日期格式快速腳本:

declare @sql nvarchar(4000) 

declare @LangID smallint 
declare @Alias sysname 

declare @MaxLangID smallint 
select @MaxLangID = max(langid) from sys.syslanguages 

set @LangID = 0 

while @LangID <= @MaxLangID 
begin 

    select @Alias = alias 
    from sys.syslanguages 
    where langid = @LangID 

    if @Alias is not null 
    begin 

     begin try 
      set @sql = N'declare @TestLang table (langdate datetime) 
    set language ''' + @alias + N'''; 
    insert into @TestLang (langdate) 
    values (''2012-06-18 10:34:09'')' 
      print 'Testing ' + @Alias 

      exec sp_executesql @sql 
     end try 
     begin catch 
      print 'Error in language ' + @Alias 
      print ERROR_MESSAGE() 
     end catch 
    end 

    select @LangID = min(langid) 
    from sys.syslanguages 
    where langid > @LangID 
end 

如果您運行此腳本,你會很多錯誤類似如下:

語言錯誤丹麥語 將varchar數據類型轉換爲日期時間數據類型導致超出範圍的值。

更獨立於語言的選擇。字符串字面量是國際標準ISO 8601格式。這種格式是非常相似的ANSI標準,除了一個「T」的日期和時間之間的文字:

insert into @TestLang (langdate) values ('2012-06-18T10:34:09') 

我進行了測試,它確實在所有的SQL語言。

+0

似乎你可以使用'YYYYMMDD'僅用於日期,並且'YYYY-MM-DDThh:mm:ss'(with破折號,是的,在日期和時間部分之間的'T')或'YYYYMMDD HH:MM:SS'(沒有破折號,沒有分隔字面值)是真正的語言獨立... –

+1

@marc_s:謝謝你的評論。我編輯了我的答案,提到了ISO 8601格式(其中包括你提到的T文字)。 –

+1

添加了一個腳本來測試所有語言的日期格式。 –

1

如果你通過任何編程語言

這裏存儲的值是在C#示例

存儲日期,你必須首先轉換,然後存儲它

insert table1 (foodate) 
    values (FooDate.ToString("MM/dd/yyyy")); 

FooDate爲datetime包含你的日期格式的變量。

6

你需要添加像

insert into table1(date1) values('12-mar-2013'); 
10

Management Studio中創建的腳本,如:

insert table1 (foodate) values(CAST(N'2012-06-18 10:34:09.000' AS DateTime)) 
2

無需使用轉換。只需將其列爲ISO 8601格式的引用日期即可。
像這樣:

select * from table1 where somedate between '2000/01/01' and '2099/12/31' 

的分離需要一個/,它需要通過單一'引號引起來。

1

我遇到了一個更一般的問題:獲取不同的(不一定是已知的)日期時間格式並將它們插入到datetime列中。我已經使用這個說法,這是最後成了一個標量函數解決了這個問題(相關ODBC規範,美國,ANSI和英國\獐日期樣式 - 可擴展):

insert into <tableName>(<dateTime column>) values(coalesce 
(TRY_CONVERT(datetime, <DateString, 121), TRY_CONVERT(datetime, <DateString>, 
101), TRY_CONVERT(datetime, <DateString>, 102), TRY_CONVERT(datetime, 
<DateString>, 103)))