SQL Server datetime LIKE SELECT?


92

MySQL에서

select * from record where register_date like '2009-10-10%'

SQL Server의 구문은 무엇입니까?


실제로 확인하고 싶은 것이 무엇입니까? 주어진 datetime에 주어진 날짜 부분이 있습니까? 또는 다른 것?
Chris J

1
이에 대한 건전한 토론 ( DATETIME문자열과 같은 값 을 처리하는 것이 나쁜 이유 , BETWEEN또는 사용하는 것이 나쁜 이유 포함 >= AND <=) 은 Aaron Bertrand의이 블로그를 참조하십시오 .
Aaron Bertrand

질문 5like-operator 태그에 대해 최소한 표가 있습니다. 동의어sql-like 를 제안 해 주 시겠습니까?
Kermit

답변:


138

DATEPART () 함수를 사용할 수 있습니다.

SELECT * FROM record 
WHERE  (DATEPART(yy, register_date) = 2009
AND    DATEPART(mm, register_date) = 10
AND    DATEPART(dd, register_date) = 10)

이 방법은 시간 구성 요소를 무시하고 선택을 제한하기 위해 다음 날 날짜를 사용할 필요가 없기 때문에 읽기 쉽습니다. 적절한 DatePart 코드를 사용하여 추가 절을 추가하여 더 많거나 더 작은 단위로 이동할 수 있습니다.

AND    DATEPART(hh, register_date) = 12)

12에서 1 사이의 기록을 얻으려면

유효한 인수의 전체 목록은 MSDN DATEPART 문서 를 참조하십시오 .


register_date에 인덱스가 있으면 인덱스를 완전히 무시하고 성능이 저하됩니다. 아마 아주 심하게.
Chris J

좋아, 그러나 문제의 날짜 다음날에 해당하는 문자열을 사용하는 문제를 피할 수 있으며 여기에 몇 가지 답변에서 제안됩니다. 문제의 날짜가 월말 또는 연도 인 경우 까다 롭습니다.
Ralph Lavelle

60

DATETIME 변수에 대해 LIKE 연산자를 직접 지원하지는 않지만 항상 DATETIME을 VARCHAR로 캐스트 할 수 있습니다.

SELECT (list of fields) FROM YourTable
WHERE CONVERT(VARCHAR(25), register_date, 126) LIKE '2009-10-10%'

CONVERT 함수에서 사용 가능한 "스타일"의 전체 목록은 MSDN 문서 를 확인하십시오 .

마크


1
동의했지만 OP는 LIKE로 datetime을 처리하는 방법을 요청했습니다 ....하지만 동의합니다. datetimes는> = 및 <= 또는 BETWEEN과 같은 범위로 처리해야합니다. 훨씬 더 나은 접근 방식
marc_s

여러분 감사합니다. 미안하지만 SQL의 초보자입니다.
Paisal

1
MSSQL 2012 (이전 버전도 생각합니다)는 datetime을 '2014-01-06T16 : 18 : 00.045'로 varchar로 변환하므로 시간 / 분도 일치시키려는 경우이를 염두에 두십시오.
balint 2014-06-23

유일하게 내가 위의 SQL 선택했다 발행하는 것은 이것이다 : WHERE CONVERT(VARCHAR(25), register_date, 25) LIKE '2009-10-10%'
가브리엘 마리우스 포 페스 쿠

10

그렇게하면 문자열 변환을 강제하는 것입니다. 시작 / 종료 날짜 범위를 만들고 다음을 사용하는 것이 좋습니다.

declare @start datetime, @end datetime
select @start = '2009-10-10', @end = '2009-11-10'
select * from record where register_date >= @start
           and register_date < @end

이렇게하면 register_date테이블 스캔이 아닌 인덱스 (에있는 경우)를 사용할 수 있습니다 .


감사합니다. 미안하지만 SQL에 대한 초보자입니다.
Paisal

8

CONVERT를 사용하여 텍스트 형식으로 날짜를 가져올 수 있습니다. varchar (10)로 변환하면 다음과 같이 대신 =를 사용할 수 있습니다.

select *
from record
where CONVERT(VARCHAR(10),register_date,120) = '2009-10-10'

또는 인덱스를 사용할 수 있다는 추가 이점과 함께 상한 및 하한 날짜를 사용할 수 있습니다.

select *
from record
where '2009-10-10' <= register_date
and register_date < '2009-10-11'

where 절에 오타가 있다고 생각합니다. "where '2009-10-10'> = register_date"
이어야합니다.

@mr_eclair : 그렇게 생각하지 마세요. 10 월 11 일 이전의 모든 날짜가 포함됩니다
Andomar

7

불행히도 'LIKE'를 사용하여 datetime을 varchar와 비교할 수는 없지만 원하는 출력은 다른 방법으로 가능합니다.

    select * from record where datediff(dd,[record].[register_date],'2009-10-10')=0

3

변환을 사용하여 LIKE를 사용하여 날짜를 검색 할 수도 있습니다. 예를 들면

select convert(VARCHAR(40),create_date,121) , * from sys.objects where     convert(VARCHAR(40),create_date,121) LIKE '%17:34%'

2

LIKE운영자는 월 또는 날짜와 같은 날짜 부분이 작동하지 않습니다하지만 DATEPART운영자는 않습니다.

개설 날짜가 1 일인 모든 계정을 찾는 명령 :

SELECT * 
  FROM Account 
 WHERE DATEPART(DAY, CAST(OpenDt AS DATE)) = 1`

* 주조 OpenDt그것의 가치에 있기 때문에 DATETIME뿐 아니라 DATE.


1

SQL Server의 날짜에 대한 LIKE 연산자는 매우 불안정합니다. 미국 날짜 형식으로 만 작동합니다. 예를 들어 다음을 시도해 볼 수 있습니다.

... WHERE register_date LIKE 'oct 10 2009%'

SQL Server 2005에서 이것을 테스트했으며 작동하지만 실제로 다른 조합을 시도해야합니다. 내가 알아 차린 이상한 점은 다음과 같습니다.

  • 예를 들어, 'apr 2 %'를 검색하면 20 일만 가져 오며 2 일은 생략합니다.

  • 전적으로 작업, 예를 들어,하지 않는 한 (와일드 카드) 문자를 표현하기 위해 '_'단일 밑줄을 사용 WHERE mydate LIKE 'oct _ 2010%'합니다 하지 모든 날짜를 반환 하기 전에 그것이 사실, 전혀 아무 것도 반환하지 않습니다 - 10!

  • 형식은 엄격한 미국식 : ' mmm dd yyyy hh:mm'

LIKEing 초 동안 프로세스를 정하는 것이 어려웠으므로 누군가이 작업을 조금 더 진행하고 싶다면 내 손님이되어주세요!

도움이 되었기를 바랍니다.


1

이 스레드에 조금 늦었지만 사실 MS SQL 서버에서 like 연산자에 대한 직접적인 지원이 있습니다.

LIKE 도움말에 설명 된대로 데이터 유형이 문자열이 아니면 문자열로 변환하려고 시도합니다. 그리고 cast \ convert 문서에 설명 된대로 :

문자열로의 기본 날짜 시간 변환은 유형 0 (, 100)이며 이는 mon dd yyyy hh : miAM (또는 PM)입니다.

DB에 다음과 같은 날짜가있는 경우 :

2015-06-01 11:52:59.057

다음과 같은 쿼리를 수행합니다.

select * from wws_invoice where invdate like 'Jun%'
select * from wws_invoice where invdate like 'Jun 1%'
select * from wws_invoice where invdate like 'Jun 1 %'
select * from wws_invoice where invdate like 'Jun 1 2015:%'
select * from wws_invoice where invdate like 'Jun ? 2015%'
...
select * from wws_invoice where invdate like 'Jun 1 2015 11:52AM'

당신은 그 행을 얻습니다.

그러나이 날짜 형식은 DateTime2 임을 암시하고 문서에 따르면 다음과 같습니다.

21 또는 121-시간, 날짜, datetime2 및 datetimeoffset에 대한 ODBC 표준 (밀리 초 포함) 기본값입니다. -yyyy-mm-dd hh : mi : ss.mmm (24h)

그러면 더 쉽게 사용할 수 있습니다.

select * from wws_invoice where invdate like '2015-06-01%'

송장 기록을 얻으십시오. 다음은 데모 코드입니다.

DECLARE @myDates TABLE (myDate DATETIME2);
INSERT INTO @myDates (myDate)
VALUES
('2015-06-01 11:52:59.057'),
('2015-06-01 11:52:59.054'),
('2015-06-01 13:52:59.057'),
('2015-06-01 14:52:59.057');

SELECT * FROM @myDates WHERE myDate LIKE '2015-06-01%';
SELECT * FROM @myDates WHERE myDate LIKE '2015-06-01 11%';
SELECT * FROM @myDates WHERE myDate LIKE '2015-06-01 11:52:59%';
SELECT * FROM @myDates WHERE myDate LIKE '2015-06-01 11:52:59.054%';

문자열로 변환하지 않고 SQL 서버에서 날짜 시간 검색을 수행하는 것은 항상 문제였습니다. 각 날짜 부분을 얻는 것은 과잉입니다 (색인을 사용하지 않을 것입니다). 아마도 문자열 변환을 사용하지 않을 때 더 나은 방법은 범위 검사를 사용하는 것입니다. 즉 :

select * from record 
where register_date >= '20091010' and register_date < '20091011';

1

이 시도

SELECT top 10 * from record WHERE  IsActive = 1 and CONVERT(VARCHAR, register_date, 120) LIKE '2020-01%'

0

나는 그렇게 내 문제를 해결했다. 개선을위한 제안에 감사드립니다. C #의 예.

string dd, mm, aa, trc, data;
dd = nData.Text.Substring(0, 2);
mm = nData.Text.Substring(3, 2);
aa = nData.Text.Substring(6, 4);
trc = "-";
data = aa + trc + mm + trc + dd;

"Select * From bdPedidos Where Data Like '%" + data + "%'";
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.