none
如何比對date time使用sql compare RRS feed

  • 問題

  • 請問各位先進:

    MemberRegisterTime在資料庫是這樣插入的

    DateTime CurrTime = DateTime.Now.ToUniversalTime().AddHours(8);
    
    cmd.Parameters.Add("@MemberRegisterTime", OleDbType.Date, 50).Value = CurrTime;


    而我現在想要的篩選條件是小於某個時間內的資料(txtEndTime 是 2013/01/05)

            OleDbCommand cmd = new OleDbCommand("Select MemberName From Member Where MemberRegisterTime<@EndTime", conn);
            cmd.Parameters.Add("@EndTime", OleDbType.Date, 50).Value = DateTime.ParseExact(txtEndTime.Text, "yyyy/MM/dd", null);

    但看來<之類的完全沒有效果

    以在網路爬完相關文章

    請各位先進指教

    謝謝



    • 已編輯 shih527 2013年4月16日 下午 03:37
    2013年4月16日 下午 03:24

解答

  • OleDbParameterCollection.Add 中, 參數型別為 Date 應該不用給長度吧, 又不是字串. Date 是有固定長度的.

    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    • 已標示為解答 shih527 2013年4月17日 下午 01:55
    2013年4月17日 上午 06:26

所有回覆

  • 您仔細看一下您的Command, 裡面參數只有SEndTime

    沒看到有EndTime,但您的Parameter卻宣告的是EndTime

    不知是您發問內容打錯了,還是原本程式就錯了 ?


    軟體開發領域裡區區一個迷途工程師
    MyBlog: http://www.dotblogs.com.tw/ian/
    開發ASP.NET您要瞭解的基楚

    微軟實戰課程日

    2013年4月16日 下午 03:35
    版主
  • 對不起,版主

    我打錯了

    但是依舊無法篩選出我想要的資料

    2013年4月16日 下午 03:38
  • 先把你的條件給固定值看看那樣的SQL會不會撈的到東西,以確定是不是 < 的問題。

    如果固定的 SQL 沒問題,撈得出你要的資料的話,那就不是 < 的問題了。

    因為我沒用過 OleDb ,所以查了一下 OleDbCommand 的建構式,你用到的應該是這一個:http://msdn.microsoft.com/zh-tw/library/5yeecx59(v=vs.80).aspx

    而上面有寫,這一個建構式的 CommandType 應該是 Text。

    對應到 Parameters 的用法,請參考:http://msdn.microsoft.com/zh-tw/library/system.data.oledb.oledbcommand.parameters(v=VS.80).aspx

    上面有提到:「當 CommandType 設定為 Text 時,OLE DB .NET Provider 不支援將參數傳遞至由 OleDbCommand 所呼叫之 SQL 陳述式或預存程序的具名參數。在這種狀況下,必須使用問號 (?) 替代符號。例如:SELECT * FROM Customers WHERE CustomerID = ?

    所以,你要不要試試看用?來取代@的用法。


    授人以魚,三餐之需;授人以漁,終生之用。
    希望各位發問的朋友,得到的是如何釣魚的知識。之後也可以分享給別人,釣魚的知識。而不是肚子餓了,就上來討魚吃。

    若您的程式碼有SQL injection的問題,在修改完畢之前,我不願意給您任何解答。因為解決了您的程式問題,造成更大的系統漏洞問題,還不如讓程式壞掉。

    請參考:SQL injection簡介與解決方式

    常用資源參考:


    小弟的blog: In 91,wiki: my wiki

    2013年4月16日 下午 03:48
    版主
  • DB是什麼 SQL SERVER?

    資料庫裡的欄位是什麼型態?

    另外有試過直接在資料庫跑您的語法,結果有如預期嗎


    軟體開發領域裡區區一個迷途工程師
    MyBlog: http://www.dotblogs.com.tw/ian/
    開發ASP.NET您要瞭解的基楚

    微軟實戰課程日

    2013年4月16日 下午 03:50
    版主
  • 您可比對CurrTimeDateTime.ParseExact(txtEndTime.Text, "yyyy/MM/dd", null) 這兩個值有什麼差異,下中斷點也好,Response.Write到頁面也好,知道兩個值就可以比較出差異,且為何篩選不出資料

    2013年4月17日 上午 03:25
  • OleDbParameterCollection.Add 中, 參數型別為 Date 應該不用給長度吧, 又不是字串. Date 是有固定長度的.

    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    • 已標示為解答 shih527 2013年4月17日 下午 01:55
    2013年4月17日 上午 06:26
  • 順道提醒,以下這句話很重要:

    OleDbParameter 物件加入至 OleDbParameterCollection 的順序必須直接對應至參數的問號替代符號在命令文字中的位置。



    Best regards

    2013年4月17日 上午 07:16
  • 謝謝前輩指教

    改用下列即可


    cmd.Parameters.AddWithValue("@EndTime", DateTime.ParseExact(txtEndTime.Text, "yyyy/MM/dd", null));


    2013年4月17日 下午 01:57