根据日期范围查找记录
Posted
技术标签:
【中文标题】根据日期范围查找记录【英文标题】:Finding a record based on range of date 【发布时间】:2017-02-23 03:06:19 【问题描述】:我对 SQL 很陌生。基本上我有一个名为“日期”列的数据库,我想返回所有条目,例如“日期”在startDate
和endDate
之间
Dim myStr As String = String.Format("Select * from 0 where [Date] between @date1 and @date2", databaseTableName)
Dim ad As New SqlDataAdapter(myStr, sqlConn)
ad.SelectCommand.Parameters.AddWithValue("@date1", frm.StartDate.Value.ToString("dd/MM/yyyy"))
ad.SelectCommand.Parameters.AddWithValue("@date2", frm.EndDate.Value.ToString("dd/MM/yyyy"))
其中frm
是 Windows 窗体日期时间选择器。
不确定我哪里出错了,但查询根本没有返回任何内容。
【问题讨论】:
您应该在查询中传递日期并调用ToString
。不要将二进制 Date
值转换为 String
。如果您真正想要做的是将时间归零,那么您就是这样做的,即使用frm.StartDate.Value.Date
。
【参考方案1】:
Dim myStr As String = String.Format("SELECT * FROM 0 WHERE [Date] >= @date1 AND < @date2", databaseTableName)
Dim ad As New SqlDataAdapter(myStr, sqlConn)
ad.SelectCommand.Parameters.Add("@date1" SqlDbType.DateTime).Value = frm.StartDate.Value.Date
ad.SelectCommand.Parameters.Add("@date2", SqlDbType.DateTime).Value = frm.EndDate.Value.Date.AddDays(1)
【讨论】:
【参考方案2】:如果设置“dd/MM/yyyy”,SQL 将返回错误“将 varchar 数据类型转换为 DateTime 数据类型导致值超出范围。”我认为你应该设置格式如下。
ad.SelectCommand.Parameters.AddWithValue("@date1", frm.StartDate.Value.ToString("yyyy/MM/dd"))
ad.SelectCommand.Parameters.AddWithValue("@date2", frm.EndDate.Value.ToString("yyyy/MM/dd"))
【讨论】:
如果您完全使用字符串来设置查询的日期值,那么您仍然做错了。 @JoelCoehoorn:我的朋友,为什么不能使用字符串来设置日期值?示例:从 Person.Person 中选择前 10 名 FirstName、ModifiedDate,其中 ModifiedDate 在 '2009/01/10' 和 '2009/01/20' 之间 几个原因。一是服务器实际上可能具有您期望的不同日期格式。直到您在德国找到客户,或者有人为 Azure 实例选择了错误的区域,这一切都是有趣和游戏。另一个原因是performance。 @JoelCoehoorn。好,我知道了。你的解决方案很棒。谢谢:)以上是关于根据日期范围查找记录的主要内容,如果未能解决你的问题,请参考以下文章