2012-12-14 3 views
1

두 날짜 사이에 데이터를 표시하는 SQL 문이 있습니다. 나는 거의 가지고 있지만 문제가있다.SQL의 BETWEEN 절

March 1,2012 to March 7, 2012을 입력하면 두 날짜 사이에 날짜가있는 데이터가 표시되어야하지만 2012 년 3 월 10 일부터 2012 년 3 월 30 일까지는 모든 날짜가 표시됩니다. 완벽하게 .. 어떤 도움을 주시면 감사하겠습니다. 감사합니다.

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

왜 날짜 필드를 하나의 필드에 저장합니까 (날짜 분석 유형에 해당)? – zerkms

+2

[SQL Injection] (http://en.wikipedia.org/wiki/SQL_injection) 공격이 기다리고있는 것처럼 보입니다. – RobEarl

+0

@zerkms 어떻게 가르쳐 줄 수 있습니까? – user1841167

답변

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) 

,

BTW (난 그냥, 귀하의 질문에서 붙여 넣기를 복사하고있어 올바른 구문에 대한 확인을 시도하지) 그 이유는 아마도 날짜가 올바른 날짜 (datetime, timestamp, ...)가 아닌 단일 열에 전체 날짜를 저장하고 세 개의 구분 된 열을 저장하지 않아야합니다.

+0

코드를 시도했지만 '피연산자가 하나의 열을 포함해야합니다'오류가 발생했습니다 ... 데이터베이스에 날짜 열이 없습니다 .. 날짜가 세 열의 연결에서만 나타납니다 ... 감사합니다. – user1841167

+0

SELECT에 날짜 별칭이 있습니다. – palako

+0

네,하지만 코드를 시도 할 때마다 항상 알 수없는 열 날짜가 나타납니다. – user1841167

0

데이터베이스에 날짜를 저장하는 잘못된 방법입니다. 날짜 열을 날짜 데이터 유형으로 변경하십시오.

당신은 할 수 :

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

이러한 접근 방식은 잘못된 것입니다.

날짜가 두 개의 간격 날짜 사이가되도록하려면 두 날짜 사이에 날짜 번호가 있어야하지 않습니다 (예 : (의사)

  • date = May-25-2012; startDate = March-15-2012, endDate = June-01-2012
  • datestartDateendDate 아직
  • day(date)있다, (15)보다 큰 1하지 day(startDate) = 15 사이 day(endDate) = 1
  • 더 인 25 사이 명확 그 사이에 번호가 없으므로 조건은 항상 거짓이됩니다.

Simil 날짜의 달 부분에 대해 예를들 수 있습니다 (예 : 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 서버의 부분에서 datetime을 만들려면 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) 
+0

오, 방금 전 당신이 말한 것을 깨달았습니다. 날짜를 만들려고합니다. BTW, 응용 언어는 vb.net이고 SQL Server는 데이터베이스입니다. – user1841167