1

我有一个 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 & "')"
4

3 回答 3

3

您正在每个“之间”中进行字符串比较。每个以 1、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)

(检查正确的语法,我只是从你的问题中复制粘贴,没有尝试过)

顺便说一句,除非您有理由这样做,否则您可能应该将整个日期存储在具有正确数据时间(日期时间、时间戳、...)的单个列中,而不是三个单独的列。

于 2012-12-14T09:35:59.287 回答
0

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

然后你可以这样做:

SELECT *
FROM table
WHERE bookingDate between to_date ('2012/03/01', 'yyyy/mm/dd')
AND to_date ('2012/03/07', 'yyyy/mm/dd');
于 2012-12-14T09:44:48.030 回答
0

这种方法是错误的。

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

  • date = May-25-2012; startDate = March-15-2012, endDate = June-01-2012
  • date显然在startDateand之间endDate,然而
  • day(date)是 25,它不在day(startDate) = 15和之间day(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 中的部分制作日期时间,请看这里,这里解释了很多技术。

此外,您应该始终避免将值粘贴到 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)
于 2012-12-14T09:45:57.420 回答