我有一个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 & "')"
答案 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
显然位于startDate
和endDate
之间,但day(date)
为25,不在day(startDate) = 15
和day(endDate) = 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)