복붙노트

[SQL] SQL 서버의 날짜를 비교하는 방법

SQL

SQL 서버의 날짜를 비교하는 방법

나는 날짜를 선택하도록 요청하고 제출 히트 HTML 양식을 가지고있다. 제출시, I에서는 ColdFusion을 사용하여 선택한 날짜 사이의 레코드를 가져 오기 위해 노력하고 있습니다. 내 쿼리는 다음과 같습니다 :

SELECT  * 
FROM    user_activation_events
where   STATUS_CODE =1
AND     event_date >= #Dateformat(form.from_date, 'dd-mm-yyyy')#
AND     event_date <= #Dateformat(form.to_date, 'dd-mm-yyyy')#

날짜가이 형식의 데이터베이스에 저장됩니다하지만이 작동하지 않습니다

    yyyy-mm-dd hh:mm:ss

누군가가 그것을 어떻게 말해 주시겠습니까?

해결법

  1. ==============================

    1.여기에 무슨 문제가 몇 가지 있습니다. 모든 양식 필드 _date의 끝은 양식 유효성 검사 기준입니다. 양식 필드에 todate 및 FROMDATE 이름이 변경 될 필요가 그래서. 그 다음으로는 입력을 소독하려고하는 것이 좋은 것입니다. CFQUERYPARAM 그렇게하는 데 사용됩니다. 마지막으로, 사이에 당신의 쿼리처럼 약간 보일 것이다 청소기 SQL이다 :

    여기에 무슨 문제가 몇 가지 있습니다. 모든 양식 필드 _date의 끝은 양식 유효성 검사 기준입니다. 양식 필드에 todate 및 FROMDATE 이름이 변경 될 필요가 그래서. 그 다음으로는 입력을 소독하려고하는 것이 좋은 것입니다. CFQUERYPARAM 그렇게하는 데 사용됩니다. 마지막으로, 사이에 당신의 쿼리처럼 약간 보일 것이다 청소기 SQL이다 :

    <cfif isDate(form.fromDate) AND isDate(form.toDate)>
    
        <cfquery name="qryUser_Activation_Events">
        SELECT * 
        FROM   user_activation_events
        WHERE  STATUS_CODE =1
        AND    event_date BETWEEN <cfqueryparam cfsqltype="CF_SQL_date" value="#form.fromDate#">
            AND DATEADD(d, 1, <cfqueryparam cfsqltype="CF_SQL_date" value="#form.toDate#">)
        ORDER BY ...
        </cfquery>
    
    <cfelse>  
        <!--- Error handling goes here --->
    </cfif>
    
  2. ==============================

    2.코멘트에 제안, 날짜를 필터링 할 수있는보다 유연한 방법은이 방법을 사용하고 있습니다. 열은 날짜 또는 날짜와 시간을 포함하고 (날짜 함수 수도를 사용하는 등) 인덱스 데이터베이스의 사용을 방해하지 않습니다 여부에 관계없이 작동합니다.

    코멘트에 제안, 날짜를 필터링 할 수있는보다 유연한 방법은이 방법을 사용하고 있습니다. 열은 날짜 또는 날짜와 시간을 포함하고 (날짜 함수 수도를 사용하는 등) 인덱스 데이터베이스의 사용을 방해하지 않습니다 여부에 관계없이 작동합니다.

        WHERE  TheDateColumn >= TheStartDateAtMidnight         
        AND    TheDateColumn < TheDayAfterEndDateAtMidnight   
    

    예를 들어, 당신이 원한다면 12/3과 2012년 12월 4일 사이의 시간 일 모든 레코드를 반환합니다 :

    <!--- omitted date validation for brevity ---> 
    <cfset form.from_date = "12/03/2012">
    <cfset form.to_date   = "12/04/2012">
    
    <cfquery name="getEvents" datasource="#dsn#">
        SELECT  event_date
        FROM    user_activation_events 
        WHERE   event_date >= <cfqueryparam value="#form.from_date#" cfsqltype="cf_sql_date">
        AND     event_date < <cfqueryparam value="#dateAdd('d', 1, form.to_date)#" cfsqltype="cf_sql_date">
        AND     status_code = 1 
    </cfquery>
    

    샘플 데이터

        2012-12-02 23:59:59.000
        2012-12-03 00:00:00.000
        2012-12-03 07:34:18.000
        2012-12-04 13:34:18.000
        2012-12-04 23:59:59.000
        2012-12-05 00:00:00.000
    

    결과 :

        1 | 2012-12-03 00:00:00.0  
        2 | 2012-12-03 07:34:18.0  
        3 | 2012-12-04 13:34:18.0  
        4 | 2012-12-04 23:59:59.0  
    

    정말 형식과는 아무 상관이 없습니다. 날짜 시간 값은 화면에서 볼 방법을 저장되지 않습니다. YYYY-MM-DD HH : MM : SS 당신이 사용하는 IDE 어떤 제시 사용자 친화적 인 문자열이며,이 다를 수 있습니다. 일반적으로 날짜 값은 실제로 숫자로 저장됩니다. 수는 일반적으로 몇 가지 기본 날짜 나 시대에서 오프셋을 나타냅니다. CF에서 /는 유닉스 시대부터 수 밀리 초 자바. mm : 당신의 IDE가 당신에게 YYYY-MM-DD HH 같은 인간 친화적 인 날짜 문자열 표시 될 수 있습니다 그래서 동안 SS를, 내부적으로는 숫자입니다.

    모든 숫자 비교 등 날짜 쿼리를 생각하십시오. 쿼리 당신이 기대하는 모든 레코드를 반환하지 않는 경우에 전달하는 번호 중 하나가 너무 크거나 작기 때문에, 보통이다.

     WHERE Col >= 1354510800000   // java.util.Date => {ts '2012-12-03 00:00:00'}
     AND   Col <= 1354683600000   // java.util.Date => {ts '2012-12-05 00:00:00'}
    
  3. from https://stackoverflow.com/questions/13666883/how-to-compare-dates-in-sql-server by cc-by-sa and MIT license