IT

SQL Server 날짜/시간 LIKE 선택?

itgroup 2023. 6. 2. 20:23
반응형

SQL Server 날짜/시간 LIKE 선택?

MySQL에서

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

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

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 문서를 참조하십시오.

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

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

MSDN 문서에서 CONVERT 기능에서 사용 가능한 "스타일"의 전체 목록을 확인합니다.

마르크

이렇게 하면 강제로 문자열 변환을 수행하게 됩니다.시작/종료 날짜 범위를 작성하고 다음을 사용하는 것이 좋습니다.

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테이블 스캔이 아닌).

변환을 사용하여 날짜를 텍스트 형식으로 가져올 수 있습니다.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'

안타깝게도 'LIKE'를 사용하여 날짜 시간을 varchar와 비교할 수는 없지만 원하는 출력은 다른 방법으로 가능합니다.

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

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

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

사용해 보세요.

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

저는 이 스레드에 조금 늦었지만 사실 MS SQL 서버에서 유사한 연산자를 직접 지원합니다.

LIKE 도움말에 나와 있는 것처럼 데이터 유형이 문자열이 아닌 경우 문자열로 변환하려고 시도합니다.캐스트\컨버트 설명서에 나와 있는 대로:

기본 datetime을 문자열로 변환하는 유형은 0(,100)이며, 이는 monddyyyh: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-ddhh: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 서버에서 문자열로 변환하지 않고 날짜 시간 검색을 수행하는 것은 항상 문제가 있었습니다.각 날짜 부품을 가져오는 것은 과도한 작업입니다(인덱스를 사용할 가능성은 거의 없음).문자열 변환을 사용하지 않는 경우 범위 검사를 사용하는 것이 더 좋습니다.i:

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

LIKE연산자는 월 또는 날짜와 같은 날짜 부품으로 작업하지 않지만DATEPART연산자가 합니다.

오픈 날짜가 1일인 모든 계정을 확인하는 명령:

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

*캐스팅OpenDt그것의 가치가 있기 때문입니다.DATETIME뿐만 아니라DATE.

SQL Server의 날짜에 대한 LIKE 연산자의 범위는 매우 불안정합니다.미국 날짜 형식만 사용할 수 있습니다.예를 들어 다음을 시도할 수 있습니다.

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

SQL Server 2005에서 테스트한 결과 작동하지만 여러 가지 조합을 사용해야 합니다.제가 주목한 이상한 점은 다음과 같습니다.

  • 날짜 내에 다른 하위 필드에 대해 모두 또는 아무것도 얻지 못하는 것 같습니다. 예를 들어, 'apr 2%'를 검색하면 20대에만 해당하는 항목이 표시됩니다. 두 번째 항목은 제외됩니다.

  • 예를 들어, 하나의 (와일드카드) 문자를 나타내기 위해 하나의 밑줄 '_'을 사용하는 것이 완전히 작동하는 것은 아니며, 10일 이전의 모든 날짜를 반환하지는 않을 입니다. 실제로는 아무것도 반환하지 않습니다!

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

저는 몇 초 동안 프로세스를 확정하는 것이 어렵다는 것을 알았기 때문에, 만약 이것을 조금 더 진행하고 싶은 사람이 있다면, 제 손님이 되어주세요!

이게 도움이 되길 바랍니다.

저는 그런 식으로 문제를 해결했습니다.개선을 위한 제안에 감사드립니다.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 + "%'";

저는 이것이 오래된 질문이라는 것을 알고 있지만, 여기에 있는 많은 답변들은 여기서 SARGable 답변을 제공하지 않으며, 구문 분석도 다루지 않습니다.

우선, 당신은 사용하는 것이 훨씬 낫습니다.>=그리고.<당신이 원하는 날짜는 다음과 같습니다.

SELECT {Your Columns}
FROM dbo.record
WHERE register_date >= '20091010'
  AND register_date < '20091011';

여기에는 당일 자정의 스트로크와 2009-10-11 이전의 나노초를 포함하여 2009-10-10의 모든 시간 값이 포함됩니다.

그러나 종종 쿼리를 매개 변수로 사용하므로 대신 사용할 수 있습니다.DATEADD두 번째 절에 일을 추가하려면:

DECLARE @DateParam date = '20091010';

SELECT {Your Columns}
FROM dbo.record
WHERE register_date >= @DateParam
  AND register_date < DATEADD(DAY,1,@DateParam);

이는 SARGability를 유지하며 다음의 모든 인덱스를 의미합니다.register_date사용할 수 있습니다.

CAST(변환(VARCHAR, BPM).업데이트됨, 3)+" ''+CONVERT(VARCHAR, BPM)업데이트됨, 108)AS VARCHAR(100) '''%''' + @Search + '%'''와 같은 항목

언급URL : https://stackoverflow.com/questions/1629050/sql-server-datetime-like-select

반응형