2014-11-21 191 views
1

當我嘗試執行此查詢插入日期

INSERT INTO StateRegion 
     (FullName , 
      Abbreviation , 
      RegionType , 
      Admitted , 
      Capital 
     ) 
VALUES ('Alabama' , 
      'AL' , 
      1 , 
      '1819-Dec-14' , 
      'Montgomery' 
     ); 

它給了我錯誤的SQL日期轉換錯誤:從文字 字符串轉換日期和/或時間時

轉換失敗

錄取爲Date類型。

的問題是我不能改變這種格式:1819-Dec-14,是有可能轉換方法添加到上面的查詢?

表定義:

CREATE TABLE StateRegion 
(
    ID   bigint  PRIMARY KEY IDENTITY(1,1), 
    FullName  varchar(50) NOT NULL, 
    Abbreviation varchar(2) NOT NULL, 
    RegionType smallint  NOT NULL, 
    Admitted  date   NULL, 
    Capital  varchar(50) NULL 
); 
+0

這有沒有工作,或者它只是停止工作? – 2014-11-21 19:35:54

+0

它應該工作! – 2014-11-21 19:36:37

+0

它沒有工作,線路沒有插入 – 2014-11-21 19:39:38

回答

6

該日期格式的月份名稱部分根據登錄語言進行解釋。

您可以更改登錄到美國英語或英式英語的默認語言,如果你必須使用格式工作或發出

Set language english 

要那麼有問題的查詢任意切換之前在運行時設置的格式它後來回來。

如果您有選擇使用yyyy-mm-dd或yyyymmdd將會是日期文字的首選格式,但在鑄造到date時都可以避免此問題。

-1

使用參數化查詢。參數化會將日期以二進制形式發送到服務器,避免依賴於客戶機區域設置的任何字符串轉換。

實例C#:

SqlCommand sqc = new SqlCommand("INSERT INTO MyTable (DateColumn) VALUES (@date)", con); 
sqc.Parameters.AddWithValue("@date", new DateTime(1819, 12, 14)); 

如果從一個交互式批處理(SQL Server Management Studio中,或類似)運行此,使用SET LANGUAGE確保日期將被正確解析:

SET LANGUAGE ENGLISH; 

INSERT INTO StateRegion (FullName, Abbreviation, RegionType, Admitted, Capital) 
VALUES ('Alabama', 'AL', 1, '1819-Dec-14', 'Montgomery'); 

SqlFiddle example showing correct parsing

+1

這個問題沒有用C#標記,爲什麼給出一個使用它的解決方案? – Lamak 2014-11-21 19:39:36

+0

@Lamak,因爲如果不是通過交互式UI完成的話,它是SQL Server最常見的客戶端。 – Mitch 2014-11-21 19:49:59

-2

您可以嘗試使用一個明確的格式轉換。你不解釋爲什麼你不能改變格式,但我想象你正在讀取那些已經存儲的值。您可以使用CONVERT

DECLARE @Admitted VARCHAR(11); 
SET @Admitted = '1819-Dec-14' 


SELECT CONVERT(DATETIME,RIGHT(@Admitted,2)+' '+ 
         SUBSTRING(@Admitted,6,3)+' '+ 
         LEFT(@Admitted,4),106); 
0

請勿混淆存儲格式和顯示格式。僅僅因爲服務器在數據庫中將日期存儲爲'1819-12-14',您可以使用自定義格式輸出來顯示。 然後用功能,如顯示問題正確:

CREATE FUNCTION usp_FormatedDateString (@Date Date) 
RETURNS VARCHAR(50) 
AS 
BEGIN 
    DECLARE @RETURN AS VARCHAR(50) 
    DECLARE @I INT = 0 
    DECLARE @M AS VARCHAR(100) = 'JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC' 
    SET @RETURN = CAST(DATEPART(YEAR,@Date) AS VARCHAR(4)) 
    SET @I = DATEPART(MONTH, @Date) - 1 
    SET @RETURN = @RETURN + '-' + SUBSTRING(@M,(@I*3)+1,3)+'-'+ CAST (DATEPART(DAY,@Date) AS VARCHAR(2)) 
    RETURN @RETURN 
END 
GO 

然後,當您顯示結果:

SELECT FullName,Abbreviation,RegionType, dbo.usp_FormatedDateString (Admitted) as Admitted, Capital FROM StateRegion 

它會顯示正確,正確地存儲。