2014-09-03 65 views
-1

我正在使用C#,MVC 4,SQL Azure。SQL Azure:在兩個日期之間獲取數據,日期爲字符串

背景:我正在用DB編寫一個網站,用戶在網站上的每個動作都將作爲用戶活動保存在我的數據庫中。

每一行,因爲這些列:

  • ID
  • 日期
  • 用戶名
  • 說明

現在到了我的問題,在我的國家,我們這樣寫日期: DD/MM/YYYY

示例:29/11/2014

奇怪我知道,但我需要這種格式。

我嘗試了一千種方法將INSERT日期值轉換成我的數據庫(SQL Azure),它們的格式不同,而且沒有任何東西可以工作,而且微軟在那裏得到了3種類型的Date,它非常非常混亂,所以我也只是設置日期字段作爲一個字符串,我組裝這樣的日期:

string date = DateTime.Now.Day.ToString() + "/" 
+ DateTime.Now.Month.ToString() + "/" 
+ DateTime.Now.Year.ToString() + " " 
+ DateTime.Now.Hour.ToString() + ":" 
+ DateTime.Now.Minute.ToString(); 

現在我想與查詢使用兩個日期「之間」這樣的數據:

SELECT [ID] 
    ,[Date] 
    ,[User] 
    ,[Description] 
FROM [dbo].[ActivityLog] 
WHERE [Date] BETWEEN 03/09/2014 AND 04/09/2014; 

我得到這個錯誤:

將nvarchar值'3/9/2014 21:3'轉換爲數據類型int時轉換失敗。

我的日期看起來像這樣的DB:

3/9/2014 21:3 

如果有人能指導我這個槽......謝謝

這是我的代碼:

public static void UpdateLog(string userName, string description) 
    { 
     try 
     { 
      string guid = Guid.NewGuid().ToString(); 
      string date = DateTime.Now.Day.ToString() + "/" + DateTime.Now.Month.ToString() + "/" + DateTime.Now.Year.ToString() + " " + DateTime.Now.Hour.ToString() + ":" + DateTime.Now.Minute.ToString(); 

      string query = "INSERT INTO ActivityLog VALUES('" + guid + "' , '" + date + "' , '" + userName + "' , '" + description + "')"; 
      AdoHelper.ExecuteNonQuery(query); 
     } 
     catch (Exception ex) 
     { 
      throw ex; 
     } 
    } 

更新:

我改變了我的代碼如下:

string query = "INSERT INTO ActivityLog VALUES('" + guid + "' , '" + DateTime.Now + "' , '" + userName + "' , '" + description + "')"; 

現在,當我看着我的數據庫我看到這一點:

03-Sep-14 

酷似我的電腦是在右下角寫(托盤圖標那裏)。

但是,這是一個問題,因爲其他人進入網站,並在他的計算機上他寫的日期不同,所以他會插入數據庫不同的格式,我能做些什麼來解決這個問題?世界標準時間 ?

+1

我會建議做一些文化和字符串格式的研究:http://msdn.microsoft.com/en-us/library/8kb3ddd4(v=vs.110).aspx和http:// msdn .microsoft.com/en-us/library/vstudio/bz9tc508(v = vs.100).aspx – 2014-09-03 18:50:24

+1

不要將日期轉換爲字符串。而是將日期作爲參數傳遞給查詢。顯示你的代碼,我可以告訴你如何去做。 – 2014-09-03 18:54:18

+0

'將nvarchar值'3/9/2014 21:3'轉換爲數據類型int.'時轉換失敗。日期字段的數據類型是什麼。錯誤消息告訴你它期望一個int,因爲日期是在數據庫中定義爲'TimeStamp'的日期。 – MethodMan 2014-09-03 18:54:44

回答

2

您不應該將日期轉換爲字符串。相反,您應該將日期作爲參數傳遞給查詢。

如果你真的想串,使用MS SQL Server的標準:YYYY-MM-dd hh:mm:ss(你在查詢結果看到的格式並不一定是服務器接受的格式

您也將有單間通報引用,這樣的:

SELECT [ID] 
    ,[Date] 
    ,[User] 
    ,[Description] 
    FROM [dbo].[ActivityLog] 
    WHERE [Date] BETWEEN '2014-09-03' AND '2014-09-04'; 
+0

Caffe刪除答案,以便其他人不給你' - 負面標記' – MethodMan 2014-09-03 18:55:40

+0

@GordonLinoff謝謝,夥計們。我編輯它是一個答案。 – 2014-09-03 18:58:56

1

這是where條款:

WHERE [Date] BETWEEN 03/09/2014 AND 04/09/2014 

這是失敗,因爲/是一個叫師算術運算符,所以我認爲這正在變成:

WHERE [Date] BETWEEN 0 and 0 

這些都是整數,SQL Server試圖[Date]轉換爲比較整數 - 因此錯誤。不幸的是(這不是那麼不幸),簡單的修復:

WHERE [Date] BETWEEN '03/09/2014' AND '04/09/2014' 

只提供了一點點的解脫。它確實發生在這種情況下,因爲日期是在同一個月。但它不會在一般情況下工作,因爲這些都爲字符串相比:

WHERE [Date] BETWEEN '03/09/2014' and '01/10/2014' 

大概是不會做你期望的。

通過在數據庫中存儲日期作爲字符串,你犯了一個基本錯誤。使用正確的類型(在這種情況下,datedatetime應該沒問題)。然後你的比較將起作用。將常量放入SQL Server時,將它們轉換爲YYYY-MM-DD形式的字符串,因爲SQL Server以這種格式理解字符串。所以,您的查詢看起來是這樣的:

WHERE [Date] BETWEEN '2014-09-03' and '2014-09-04' 

(或者你可以使用顯式轉換,這在我看來只是使查詢更難讀。)

你的同胞國家的人如何選擇看日期是無關緊要的。輸出日期時,請使用convert()將其轉換爲首選格式。當您將日期作爲字符串輸入時,請使用convert()從首選格式轉換 - 或者讓他們從日曆工具中選擇日期。在數據庫內部,使用數據庫最熟悉的格式 - 內置的日期和時間類型。

+0

Gordon所以你的底線是: 我需要發送一個DateTime(類型)到SQL服務器並將它存儲在Azure中的日期時間字段中,並像美國人一樣使用日期工作? – Ron 2014-09-03 19:19:30

+0

我試圖從一種格式轉換爲另一種格式的DateTime,它從來沒有工作過......你之前使用過convert嗎? – Ron 2014-09-03 19:20:34

+0

@Ron ...是的,經常。 – 2014-09-03 19:44:34

1

如果您試圖在SQL中完成此操作而不是您的代碼,並且您的日期值保證以上述示例的方式一致地格式化,則可以使用下面的CONVERT/CAST方法獲取格式你需要。

SELECT CONVERT(varchar(50),CAST('3/9/2014 21:3' as smalldatetime),103) [DD/MM/YYYY Format] 

本文就CAST和CONVERT也可能對你有用。 http://msdn.microsoft.com/en-us/library/ms187928.aspx

相關問題