2013-08-21 32 views
1

字符串s = @ + mcCalendar.SelectionStart.ToShortDateString()日期時間方程式不返回任何值。 SQL Server 2008中

,所以我有這樣的代碼 「從Bill_Detail其中DateTimeofBilling ='選擇*」。由於toshortdatestring,mcCalendar的值爲'8/20/2013'。 我只需要從日期mcCalendar獲取所有行。

所以它是

SELECT * FROM Bill_Detail其中DateTimeofBilling = '8/20/2013年'

在數據庫表DateTimeofBilling是DateTime數據類型。 sqlserver 2008

爲什麼不能得到我期望使用此代碼的行?

回答

0
string s = @"select * from Bill_Detail where DateTimeofBilling=CONVERT(date, '" + mcCalendar.SelectionStart.ToShortDateString() + "'); " 

應該做你正在尋找(你沒有在最後一個結束的')是什麼。但是,參數化查詢是更好的方法。

看下面的代碼是否返回結果。如果您的字段的命名是正確的,那麼您可能會專門尋找'08/20/2013 12:00:00',而無需轉換。

select * from Bill_Detail where CONVERT(date, DateTimeofBilling)='08/20/2013'; 
2

猜測ToShortDateString實際上並不返回你希望它的價值無論如何,文化方面的原因。正確的修復改變文本處理 - 這是使用參數化查詢:

string sql = "select * from Bill_Detail where [email protected]"; 
using (var command = new SqlCommand(sql, conn)) 
{ 
    command.Parameters.Add("@QueryDate", SqlDbType.Date).Value = 
     mcCalendar.SelectionStart.Date; 
    // Execute the command 
} 

始終使用參數化查詢,而不是建立包含值的SQL字符串:

  • 它避免SQL injection attacks
  • 它可以避免像這樣的數據轉換問題
  • 它有助於保持您的代碼而不是美國式的(在SQL)從數據獨立的,這使得它更容易地看到發生了什麼事情
+0

@Volearix:這不是一個合適的編輯。編輯對*固定*代碼或拼寫錯誤等很好,但不會更改代碼的*風格*,因爲在這種情況下您碰巧不喜歡使用'var'。 –

+0

我只想插入。 –

+0

@JeoTalavera:那麼你現在的代碼根本就沒有插入 - 它正在做一個查詢。目前尚不清楚爲什麼現在要插入插入 - 但你應該使用參數化的SQL * *方法。 –

0

如果您的服務器被配置爲一個英國式的日期(日/月/年)(毫米/ dd/yyyy),那可能會導致你的問題。嘗試指定你的日期爲'dd-mmm-yyyy'。

string queryDate = mcCalendar.SelectionStart.Date.ToString("dd-MMM-yyyy"); 
string s = "SELECT * FROM Bill_Detail WHERE DateTimeofBilling = '" + queryDate + "'"; 
+0

爲什麼要使用字符串表示呢? IMO的參數化查詢。 –

+0

這很簡單。 Jon雖然可能是對的,但你可能是一個_better_答案。然而,我不喜歡使用var。 – Erresen

+0

「var」的使用是一種簡單的文體選擇,對於答案根本不重要。我實際上並不認爲代碼以字符串轉換的方式變得更簡單 - 個人來說 - 使用混亂的字符串連接讀取*當然不是那麼簡單。代碼不起作用 –

0

發生這種情況是因爲您已從您的where子句中刪除時間元素。

例如,如果您有值:「8/20/2013 00:00:00」,那麼它將預計完整DateTime參數。

有幾種方法可以解決它。

1)使用下面的SQL:

string s = @"select * from Bill_Detail where DateTimeofBilling like '" 
+ mcCalendar.SelectionStart.ToShortDateString() + "%'"; 

OR

2)刪除了 「ToShortDateString」,讓您通過參數是一個完整的日期和時間(mcCalendar.SelectionStart = 8/20/2013 00:00:00)

string s = @"select * from Bill_Detail where DateTimeofBilling = '" 
    + mcCalendar.SelectionStart + "'"; 
+0

但第二個語句的問題是,它會將它等同於小時,分鐘和秒鐘,我只想從特定日期獲取行。 –

+0

當你的行被存儲到數據庫中時,它們是否具有日期時間部分的值? 如果是這樣,那麼我會說嘗試選項1,如果不是,那麼你選擇嘗試哪個選項並不重要 – Aaron

+0

「like」ddoesnt在dat上工作時間。它只適用於我認爲的字符串 –

相關問題