c#
  • .net
  • sql
  • sql-server
  • 2013-03-08 116 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命令,即可大功告成。

    相关问题