选择日期(仅限日期时间)

时间:2017-01-08 03:11:52

标签: sql-server vb.net

如何在日期格式dd / mm / yyyy h:mm:ss中搜索日期dd / mm / yyyy的数据库(sql server)中的记录。

如果列是日期它可以正常工作但是当我把它设为日期时间并且想要查看特定日期数据库中是否有记录时它会有所不同,因为有时间

所以我怎样才能在列为datetime时搜索日期。

这就是我正在使用的:

    If SQL.conn.State = ConnectionState.Open Then
        SQL.conn.Close()
    End If
    DateTime1.Format = DateTimePickerFormat.Custom
    DateTime1.CustomFormat = "yyyy/MM/dd"

    SQL.conn.Open()
    Dim cmd As New SqlCommand("Select count(eid) from employees_payroll WHERE eid=" & employee_id & " and wday= '" & DateTime1.Text & "'", SQL.conn)
    count = Convert.ToInt32(cmd.ExecuteScalar())
    SQL.conn.Close()
    DateTime1.CustomFormat = "yyyy-MM-dd"

2 个答案:

答案 0 :(得分:2)

几种解决方案。转换日期到目前为止,这消除了时间

 Select * from table where cast (column as Date) = '1 jan 2017'

第二,使用日期差异功能

 Select * from table where datediff(day, column, '1Jan2017') = 0

第三,使用datediff和dateadd

剥离时间部分
 Select * from table 
 where dateadd(day, datediff(day, 0, column), 0) = '1Jan2017'

另外,与开始和结束时的午夜相比

 Select * from table 
 where column >= '1 Jan 2017'
    and column < '2 jan 2017'

上一个解决方案只允许在日期列

上使用索引

EDIT(解决Joel在评论中提出的问题):     请理解,您用于将此查询传递给服务器的C#代码容易受到所谓的&#34; SQL注入&#34;的影响。如果您的应用程序是从不受信任的用户的输入构建此SQL,那么这是一个灾难邀请。作为乔;在下面的答案中建议,应修改C#代码以使用具有已定义参数的命令对象,而不是动态构造的SQL。但是,SQL语句本身仍然可以是上面提出的任何解决方案。

答案 1 :(得分:1)

Using cn  As New SqlConnection("connection string here"), _
      cmd As New SqlCommand("Select count(eid) from employees_payroll WHERE eid= @employee_id and wday >= @wday and wday < DATEADD(dd, 1, @wday)", cn)

    cmd.Parameters.Add("@employee_id", SqlDbType.Int).Value = Convert.ToInt32(employee_id)
    cmd.Parameters.Add("@wday", SqlDbType.DateTime).Value = DateTime1.Value

    cn.Open()
    count = Convert.ToInt32(cmd.ExecuteScalar())
End Using

关于此代码的一些注释

在.Net中,您确实希望为大多数操作使用全新的连接对象。尝试在整个应用程序中重用相同的连接对象是错误的。真。 SQL Server的ADO.Net提供程序使用称为连接池的东西,当您在应用程序中坚持使用相同的对象时,您将失去这种优势。不需要共享公共连接对象,只需共享一个公共连接字符串,以便在需要时创建新对象。然后,您还可以将事物包装在Using块中,以便根据需要正确关闭此连接,即使抛出异常也是如此。请注意,此示例中我不必cn.Close(),这不是错误。 Using正确处理此问题。

不要使用字符串连接将数据值放入sql命令语句中! 有几个原因,其中包括性能(您获得执行计划)安全性(不再是sql注入vulernability!)来修复格式化问题,比如你在这里的格式问题。即使这看起来像私有winforms应用程序,而不是公共Web应用程序,您仍然需要使用参数化查询。

当您开始在数据库中使用DateTime值时,列值中的始终时间组件,并且Sql Server 始终使用这些值进行比较完整的日期和时间,没有exeptions。如果您没有指定时间,Sql Server将使用&#34; 0&#34;时间价值,意思是午夜。因此,比较DateTime列中的两个&#34;日期&#34;只有在比较的双方具有完全相同的时间值时才有效。如果您想知道DateTime值是否落在特定日期,则执行此操作的正确方法是检查它是否大于或等于当天的开始且小于第二天的开始。如果您愿意,可以而是将wday列投射到Date类型以进行此查询。我鼓励你这样做,因为它会阻止Sql Server使用该列可能存在的任何索引。