c#
  • .net
  • sql
  • sql-server
  • 2013-03-08 112 views 3 likes 
    3

    我有一條SQL SELECT語句可以根據當前日期從我的表中選擇記錄。我想要做的是比較沒有時間戳的日期,因爲時間不匹配。我只關心日期。如何僅比較SQL Select語句中的日期(不帶時間戳)

    以下是我有:

    string SQL = @"SELECT Trans_Set_Id FROM EDI10002 " + 
          @"WHERE (Tp_Id = '" + tpid + "' AND Rec_Date = '" + DateTime.Now.ToShortDateString() + @"')"; 
    

    我遇到的問題是如何獲取只能從外地「Rec_Date」的日期?

    +0

    你使用的是什麼版本的SQL Server – HLGEM 2013-03-08 18:00:18

    +0

    作爲一個附註,你能保證tpid總是一個整數嗎? (我是這麼認爲的)[Sql Injection](http://xkcd.com/327/)不好 – 2013-03-08 18:02:02

    +0

    使用SQL Server 2005版本。 – hmakled 2013-03-08 18:21:35

    回答

    2

    稍微老式的方式做到這一點的DATEPART函數爲:

    string SQL = "SELECT Trans_Set_Id FROM EDI10002 WHERE (Tp_Id = '" + tpid + "' AND CONVERT(varchar(10),Rec_Date, 101) = CONVERT(varchar(10), " + DateTime.Now.ToShortDateString() + ", 101))"; 
    

    你基本上轉化爲MM/DD/YYYY然後截斷結束。

    編輯: 隨着GETDATE()

    string SQL = "SELECT Trans_Set_Id FROM EDI10002 WHERE (Tp_Id = '" + tpid + "' AND CONVERT(varchar(10),Rec_Date, 101) = CONVERT(varchar(10), getdate(), 101))"; 
    
    +0

    我試過並得到一個錯誤消息:在當前上下文中不存在名稱'CONVERT' – hmakled 2013-03-08 17:38:31

    +0

    您使用的SQL版本是什麼? – RandomUs1r 2013-03-08 17:40:14

    +0

    我有一個簡單的錯字,現在就試試。 – RandomUs1r 2013-03-08 17:42:51

    1

    如果您只關心日期部分並希望刪除時間部分,請嘗試使用TRUNC(Rec_Date)。喜歡的東西:

    ... "' AND TRUNC(Rec_Date) = '" + DateTime.Today... 
    

    (這曾在甲骨文...它可能只是一個Oracle的事情...)

    +0

    當我這樣做時,我得到一個錯誤,說「TRUNC不是一個公認的內置函數名稱」 – hmakled 2013-03-08 17:27:42

    +0

    啊,我曾經在Oracle中使用它。可能只是一個Oracle的東西。 – 2013-03-08 17:28:27

    +0

    是的,我使用MS SQL,但無論如何感謝 – hmakled 2013-03-08 17:30:26

    4

    如果你使用SQL Server 2008及以上版本,你可以這樣做:

    select cast(getdate() as date) 
    
    +0

    我會在我的「Rec_Date」字段上使用強制轉換功能嗎?我將在哪裏插入我的領域? – hmakled 2013-03-08 17:31:22

    +1

    我會假設CAST將時間重置爲午夜返回日期,所以您希望使用DateTime.Today而不是DateTime.Now。嘗試'...「'和CAST(Rec_Date AS DATE)='」+ DateTime.Today ...' – 2013-03-08 17:39:39

    +0

    @Grant - 我得到錯誤消息:類型DATE不是定義的系統類型。哇,發生了什麼事。 – hmakled 2013-03-08 17:43:53

    2

    你在使用什麼數據庫?

    看一看爲MSSQL http://msdn.microsoft.com/en-us/library/ms174420.aspx

    +0

    我正在使用MS SQL – hmakled 2013-03-08 17:29:27

    +0

    看看這個鏈接,我認爲它有你在找什麼http://stackoverflow.com/questions/1503298/sql-statement-to- select-all-rows-from-previous-day – Jras 2013-03-08 18:03:01

    1

    下應在SQL Server的所有版本,無論Rec_Date類型:

    SELECT Trans_Set_Id 
    FROM EDI10002 
    WHERE Tp_Id = @tpid 
         AND (Rec_Date >= DATEADD(day, DATEDIFF(day, 0, GETDATE()), 0) 
          AND Rec_Date < DATEADD(day, DATEDIFF(day, 0, GETDATE()), 1)) 
    

    採用DATEADD(day, DATEDIFF(...), ...)得到初具體的一天。這意味着如果您有一個在Rec_Date上定義的索引,它可以用來檢索請求的行。

    1

    首先,您希望擺脫使用字符串連接構建動態sql語句的習慣,您希望使用參數化查詢。

    其次在你的例子中,你不需要從客戶端提供日期,它可以全部在sql中完成。

    string SQL = @"SELECT Trans_Set_Id FROM EDI10002 " + 
        @"WHERE (Tp_Id = @tpid" + 
        @" AND convert(varchar(10, Rec_Date, 121) = CONVERT(varchar(10), getdate(), 121))"; 
    

    ,或者如果你正在使用2008

    string SQL = @"SELECT Trans_Set_Id FROM EDI10002 " + 
        @"WHERE (Tp_Id = @tpid" + 
        @" AND cast(Rec_Date as date) = cast(getdate() as date))"; 
    

    添加@tpid作爲paremter到您的SQL命令,即可大功告成。

    相關問題