SQL에서 날짜를 비교하는 쿼리


84

11 월에 발생한 모든 날짜가있는 테이블이 있습니다. 이 쿼리를 작성했습니다.

select id,numbers_from,created_date,amount_numbers,SMS_text 
from Test_Table
where 
created_date <= '2013-04-12'

이 쿼리는 '2013-04-12'날짜 (12 월) 이전 에 발생 했으므로 11 월 (11 월)에 발생한 모든 것을 반환해야합니다.

그러나 그것은 단지보다 적은 일에 일어난 가능한 날짜를 반환하는 것 04 (2013- 04 -12)

하루 부분 만 비교하는 것일까 요? 전체 날짜가 아니라 고요?

이 문제를 해결하는 방법?

Created_date는 date 유형입니다.

날짜 형식은 기본적으로 yyyy-dd-MM입니다.


1
당신은 문자열에 날짜를 비교하고,하지 날짜에 날짜
파나지오티스 Kanavos

4
어쩌면 그렇게 생각 2013-04-12합니까? 4 월 12 일입니까? 아니면 created_date날짜가 아니라 문자열일까요?
jpw

에서 봐 캐스트 및 변환 T-SQL 설명서에와 로케일에 해당하는 변환을 사용
스티브

3
캐스팅 할 필요가 없습니다. 고정 형식 '20130412'를 사용하면됩니다.
Panagiotis Kanavos 2013

1
그런 다음 날짜가 포함 된 문자열을 보내는 대신 매개 변수가있는 쿼리를 만들고 날짜 형식의 매개 변수로 날짜를 전달하십시오. BTW 어떤 버전의 SQL Server를 사용하고 있습니까? DATE는 SQL Server 2008에 추가되었습니다.
Panagiotis Kanavos 2011

답변:


84

지역 문화에 따라 의미가 달라지는 '2013-04-12'대신 문화 불변 형식으로 인식되는 '20130412'를 사용합니다.

년 12 월 4 비교하려면 , 당신은 '20131204'를 작성해야합니다. 당신이 4 월 12 비교할 경우 , 당신은 '20130412'를 작성해야합니다.

이 기사를 쓰기 국제 거래-SQL 문 SQL 서버의 문서에서 문화의 불변 문을 작성하는 방법을 설명합니다 :

다른 API 또는 Transact-SQL 스크립트, 저장 프로 시저 및 트리거를 사용하는 응용 프로그램은 구분되지 않은 숫자 문자열을 사용해야합니다. 예를 들어, yyyymmdd는 19980924입니다.

편집하다

ADO를 사용하고 있으므로 가장 좋은 방법은 쿼리를 매개 변수화하고 날짜 값을 날짜 매개 변수로 전달하는 것입니다. 이렇게하면 형식 문제를 완전히 방지하고 매개 변수가있는 쿼리의 성능 이점도 얻을 수 있습니다.

최신 정보

리터럴에서 ISO 8601 형식을 사용하려면 모든 요소를 ​​지정해야합니다. datetime 문서의 ISO 8601 섹션에서 인용하려면

ISO 8601 형식을 사용하려면 형식에 각 요소를 지정해야합니다. 여기에는 형식에 표시된 T, 콜론 (:) 및 마침표 (.)도 포함됩니다.

... 두 번째 구성 요소의 비율은 선택 사항입니다. 시간 구성 요소는 24 시간 형식으로 지정됩니다.


@andy 정확히는 아니지만 ISO8601 형식 에는 시간 요소가 포함됩니다 . 또는 문서에서 말했듯To use the ISO 8601 format, you must specify each element in the format. This also includes the T.
Panagiotis Kanavos 2015 년

1
명확하지 않은 점에 대해 죄송합니다. 내 요점은 ISO8601이 YYYY-MM-DD 또는 짧은 YYYYMMDD의 설명대로 순서를 정의한다는 것입니다. 그러나 문서에도 "날짜 시간은 ANSI 또는 ISO 8601을 준수하지 않습니다."라고 명시되어 있습니다. ISO 자체에는 시간 부분이 필요하지 않습니다.
앤디

당신이 사실은 변경되지 않습니다 참조 YYYY-MM-DD되어 있지 ISO 8601 부분을 시간으로 인식 되어 필요합니다. 원한다면 T-SQL의 이상하거나 불완전한 구현이라고 부릅니다. 심지어이는 사이베이스에서 이월 된 것을있을 수 있습니다
파나지오티스 Kanavos

32

이렇게 해봐

select id,numbers_from,created_date,amount_numbers,SMS_text 
from Test_Table
where 
created_date <= '2013-12-04'

6
문화 별 형식. 4 월 12 일인가요, 12 월 4 일인가요? 대시로 구분 된 형식은 국제 형식이 아닙니다
Panagiotis Kanavos 2013

1
그렇다면 해외 고객의 데이터를 저장해야 할 때 어떻게됩니까? 아니면 사용자의 문화 를 따르는 웹 브라우저에서 날짜가 나왔습니까? 가이드 라인은 이유가 있으며 잘못된 형식을 사용하지 않음으로써 모든 오류를 방지 할 수 있습니다.
Panagiotis Kanavos

1
이 반환 4 월 12 일 @Nithesh
HelpASisterOut

19
@PanagiotisKanavos 대시로 구분 된 형식 ISO 8601 이 1988 년에 발표 된 이후로 국제 형식입니다 . 다른 형식은 권장하지 않으며 조롱 합니다. 게시 한 "국제 Transact-SQL 문 작성" 기사에서도 'yyyymmdd'를 "국제"표준으로 식별 한 적이 없습니다.
Jesse Webb

2
날짜 주위에 작은 따옴표를 추가하면이 문제가 해결되었습니다. 2015 년 2 월 19 일 형식을 사용했습니다. '2015 년 2 월 19 일'로 변경되어 작동하기 시작했습니다. 간단한 아이디어에 감사드립니다.
Ethan Turk

10

date vale로만 비교하는 경우 datetime 이 아닌 date로 변환 하면 작동합니다.

select id,numbers_from,created_date,amount_numbers,SMS_text 
 from Test_Table
 where 
 created_date <= convert(date,'2013-04-12',102)

이 변환은 GetDate () 함수를 사용하는 동안에도 적용됩니다.


4

당신은 입력 <=하고 주어진 날짜도 잡을 것입니다. <로만 교체 할 수 있습니다 .


2

아래 쿼리로 시도하십시오

select id,numbers_from,created_date,amount_numbers,SMS_text 
from Test_Table
where 
convert(datetime, convert(varchar(10), created_date, 102))  <= convert(datetime,'2013-04-12')

0

날짜 형식은 yyyy-mm-dd입니다. 따라서 위 쿼리는 2013 년 4 월 12 일보다 오래된 레코드를 찾습니다.

날짜 문자열을 '2013-04-30'으로 설정하여 빠른 확인을 제안하십시오 .SQL 오류가 없으면 날짜 형식이 yyyy-mm-dd로 확인됩니다.


0

날짜 전후에 "#"을 사용하고 시스템 날짜 형식을 확인하십시오. 아마도 "YYYYMMDD O YYYY-MM-DD O MM-DD-YYYY O USING '/ O \'"

전의:

 select id,numbers_from,created_date,amount_numbers,SMS_text 
 from Test_Table
 where 
 created_date <= #2013-04-12#
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.