根据日期范围查找记录

Posted

技术标签:

【中文标题】根据日期范围查找记录【英文标题】:Finding a record based on range of date 【发布时间】:2017-02-23 03:06:19 【问题描述】:

我对 SQL 很陌生。基本上我有一个名为“日期”列的数据库,我想返回所有条目,例如“日期”在startDateendDate 之间

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。好,我知道了。你的解决方案很棒。谢谢:)

以上是关于根据日期范围查找记录的主要内容,如果未能解决你的问题,请参考以下文章

mysql日期范围查找(两个日期之间的记录)

核心数据 - 查找具有重叠日期范围的记录

SQL 查询日期范围保存在 2 列中

如何生成列表而忽略日期不符合我要查找的范围的记录?

选择日期范围,根据关闭条件计算范围内的多条记录,按班次分组

如何根据关键和时间间隔有效地查找父记录?