2015-06-02 76 views
0

T-SQL使用哪種日期格式?它依賴於系統日期嗎?我如何確保無論系統日期格式如何,我的參數都能正確傳遞。這個問題來,因爲錯誤的:哪種SQL日期格式

Error converting data type nvarchar to datetime.

的SQL腳本部分:

CREATE PROCEDURE [dbo].[sz_pipeline04_pipelUpdte_inventory] 
-- Add the parameters for the stored procedure here 
@myFixDte datetime, 
@doInsert bit 
AS 
BEGIN 

調用C#代碼:

public static DataTable GridInventory(string strdProcedureName, DateTime fixDate, bool execInsertYN) 
    { 
     DataTable dtbl_inventory = null; 
     try 
     { 
      dtbl_inventory = new DataTable(); 

      using (var conn = new SqlConnection(cls_connRegistry.GetConnStrFull())) 
      using (var command = new SqlCommand(strdProcedureName, conn) 
      { 
       CommandType = CommandType.StoredProcedure 
      }) 
      { 

       command.Parameters.Add("@myFixDte", SqlDbType.DateTime).Value = DateTime.Parse(fixDate.ToShortDateString()); 
       command.Parameters.Add("@doInsert", SqlDbType.Bit).Value = execInsertYN; 

       conn.Open(); 
       SqlDataReader dr = command.ExecuteReader(); 
       dtbl_inventory.Load(dr); 
       conn.Close(); 
      } 
     } 
     catch (Exception datawalile) 
     { dtbl_inventory = null; } 

     return dtbl_inventory; 
    } 

編輯的問題。

+2

[這裏](https://msdn.microsoft.com/ru-ru/library/ms187928.aspx)關於將varchar轉換爲數據類型的鏈接 –

+0

@ N.Molderf謝謝。然而,這裏的問題不是關於SQL中的日期格式,而是我如何知道/獲得當前使用SQL的日期格式,或者使用任何SQL日期格式的每一個工作時間的ONE函數。所以我在我的c#應用程序中發送參數,而GUI日期控件按照系統日期格式更改日期格式 - 很好:我會認爲SQL遵循相同的邏輯,但顯然不是 - 我如何傳遞這些參數。 – Chagbert

+2

理想情況下,如果您從另一種語言訪問SQL,請使用*參數*作爲DateTime值傳遞數據,讓語言綁定/數據訪問庫處理SQL Server的'datetime'類型的轉換並避免傳遞它作爲*字符串*在所有。格式問題僅在將值作爲*字符串*而非適當類型傳遞時纔會出現。 –

回答

-1

你爲什麼沒有告訴如上C#日期時間,這裏是你一個簡單的例子,如何解決你的情況下,這個問題會是這樣的

DateTime myDateTime = DateTime.Now; 
string sqlFormattedDate = myDateTime.ToString("dd-MM-yyyy HH:mm:ss"); 

或這一個

DateTime myDateTime = DateTime.Now; 
string sqlFormattedDate = myDateTime.ToString("yyyy-MM-dd HH:mm:ss"); 

第二個是默認的

+0

這個假設我會將一個字符串參數傳遞給sql。我正在傳遞日期時間格式。哪個最好? – Chagbert

+0

在你的情況下,你不知道你在SQL端的日期時間,所以這個解決方案會對你更好,只是嘗試它是如何工作的 –

+0

@Chagbert日期實際上可能超出該範圍嗎?它來自用戶輸入嗎?如果對這些問題中的任何一個的答案都是肯定的,那麼你應該經常檢查 - 否則你會讓應用程序容易出錯。 –

0

這是無效的DATETIME格式DD-MM-YYYY

您可以使用CONVERT它在以下幾點:

DECLARE @myFixDte DATETIME 
SET @myFixDte = CONVERT(DATE, N'30-12-2012', 104) 
SELECT @myFixDte 

或者,你可以設置它沒有在其他格式的轉換像YYYY-MM-DD

+0

如何將此標記爲最佳答案?謝謝 – Chagbert

+0

檢查答案左上方的「V」。 –

0

試試這個:

@myFixDte = convert(datetime, '30-12-2012', 105) 

並檢查鏈接由@ N.Molderf提供

+0

見上文。我認爲格式不僅是日,月和年的順序,還有分隔符(「 - 」或「。」或「/」):我怎麼知道哪個在使用? – Chagbert

0

SQL Server始終以相同的方式識別一種格式,無論使用哪種文化,並且該格式爲YYYYMMDD

因此,您可以始終使用格式爲2012020220151225的日期,並且SQL Server將使用相同的掩碼來分析該參數。

+0

你是對的 - 我當時並不知道,但是在我實現了很多谷歌和SQL文檔之後。 – Chagbert

1

您現在發佈的代碼看起來是正確的 - 除了一件事:

command.Parameters.Add("@myFixDte", SqlDbType.DateTime).Value = DateTime.Parse(fixDate.ToShortDateString()); 

正如我在評論中所說的,問題只出現在轉換爲字符串時的格式化。所以只是做:

command.Parameters.Add("@myFixDte", SqlDbType.DateTime).Value = fixDate; 

DateTime秒(C#)和datetime(T-SQL)不的格式。將格式轉換爲字符串時會出現格式問題。在它們的本地表示中,它們通常只是從過去的某個固定點開始的許多事件(蜱,毫秒等)的計數。 ADO.Net知道如何將DateTime轉換爲SQL Server datetime

如果您仍然存在轉換問題,則代碼中尚未顯示。但它會再一次成爲因爲你正在轉換正確的數據類型(datetime)並使用字符串。