SQL中的BETWEEN子句

时间:2012-12-14 09:24:26

标签: sql sql-server vb.net between

我有一个SQL语句来显示两个日期之间的数据。我几乎得到了它,但是有一个问题。

如果我输入March 1,2012 to March 7, 2012 ..它应该显示两者之间的日期数据..但它也显示2012年3月的所有日期..但每当我输入2012年3月10日到2012年3月30日SQL工作完美..任何帮助将不胜感激。感谢

SELECT 
   agentname, noofcalls, qualified, booking, resched, 
   actualbooking, sales, remarks, 
   concat(month,' ',day,',',year) as 'date' 
FROM 
   tblagents
WHERE 
   (month between '" & cbosmonth.Text & "' AND '" & cboemonth.Text & "')
   AND (day between '" & cbosday.Text & "' AND '" & cboeday.Text & "')
   AND (year between '" & cbosyear.Text & "' AND '" & cboeyear.Text & "')"

3 个答案:

答案 0 :(得分:3)

你正在每个'之间'进行字符串比较。每个以1,a 2或3开头的数字,无论其后面是什么,即21,或26,或31,如果你把它们视为字符串,它们都低于7。 1到30是有效的,因为你只留下31,而且30< 31也是一个字符串。

首先进行连接,然后进行连接:

WHERE concat(month,' ',day,',',year) 
      BETWEEN concat(cbosmonth.Text,' ', cbosday.Text,' ',cbosyear.Text)
      AND concat(cboemonth.Text,' ', cboeday.Text,' ',cboeyear.Text)

(请查看正确的语法,我只是从你的问题中复制粘贴,而不是尝试它)

除非你有理由,否则你可能应该将整个日期存储在具有正确数据时间(日期时间,时间戳,...)的单个列中,而不是三个独立的列。

答案 1 :(得分:0)

这是在数据库中存储日期的错误方法。 将日期列更改为数据类型日期

然后你可以这样做:

SELECT *
FROM table
WHERE bookingDate between to_date ('2012/03/01', 'yyyy/mm/dd')
AND to_date ('2012/03/07', 'yyyy/mm/dd');

答案 2 :(得分:0)

这种做法是错误的。

为了使日期在两个间隔日期之间,它不必在两个日期之间有一个日期编号,例如(伪代码)

  • date = May-25-2012; startDate = March-15-2012, endDate = June-01-2012
  • date显然位于startDateendDate之间,但
  • day(date)为25,不在day(startDate) = 15day(endDate) = 1之间
  • 更多,因为15大于1,它们之间没有数字,所以条件总是假的

可以对日期的月份部分(例如date = May-25-2012; startDate = September-15-2010, endDate = Match-01-2015

进行类似示例

您需要获取日,月,年的值,并在应用程序或服务器上构建日期,并使用它来比较值。


从VB

中的文本字段创建日期
Dim startDate = new DateTime( 
      Convert.ToInt32(cbosyear.Text), 
      Convert.ToInt32(cbosmonth.Text), 
      Convert.ToInt32(cbosday.Text))

请注意,如果用户输入此内容,则会失败,例如年度价值的“一些文字”。您需要添加一些数据验证才能实现这一目标。

要从SQL Server中的部分take a look here创建日期时间,需要解释相当多的技术。

此外,你应该总是避免将值粘贴到sql字符串中,这就是要求sql注入问题。你应该这样做:

Dim command = new SqlCommand()
command.CommandText = "SELECT .... FROM tblagents where DATEFROMPARTS(year, month, day) between @startDate AND @endDate"
command.Parameters.AddWithValue("@startDate", startDate)
command.Parameters.AddWithValue("@endDate", endDate)