2016-11-11 1 views
0

열이 createdDatemodifiedDate 인 특정 테이블에서 레코드를 가져 오는 가장 좋은 스크립트는 무엇입니까 modifiedDate은 유일한 nullable 열이고 현재/현재 날짜와 동일합니까?두 날짜 열을 기준으로 레코드 선택

수정 된 날짜 열의 null 값이있는 경우 스크립트에 생성 된 날짜가 표시됩니다.

출력은 최신으로 생성되거나 수정 된 데이터가있는 모든 레코드를 가져와야합니다.

SELECT * 
FROM table 
WHERE ISNULL(CONVERT(date, ModifiedDate), 
      CONVERT(date,CreatedDate)) = CONVERT(date, getdate()) 

또는

SELECT * 
FROM table 
WHERE CASE WHEN ModifiedDate IS NULL 
      THEN CONVERT(date, CreatedDate) 
      ELSE CONVERT(date,ModifiedDate) END = CONVERT(date, getdate()) 
+1

'convert (date, ModifiedDate)'... 날짜가 아닌 유형으로 날짜 정보를 저장하고 있음을 의미하기 때문에이 방식이 좋지 않습니다. –

+0

같은 날짜의 레코드를 가져와야합니다. 시간을 제거하기 위해 Convert (날짜, 날짜/시간)를 사용했으며, 날짜를 기준으로 ModifiedDate를 시도했습니다. 가장 빠른 방법으로 레코드를 가져와야합니다. – jankenshin2004

+0

무엇이 잘못 되었나요? 이것으로 당신은 무엇을 시도 했습니까? –

답변

1

이이 간단해야한다 :

SELECT * 
FROM tbl 
WHERE CAST(CreatedDate AS DATE) = CAST(GETDATE() AS DATE) 
    OR (ModifiedDate IS NOT NULL AND CAST(ModifiedDate AS DATE)= CAST(GETDATE() AS DATE)); 

일부의 생각 :에 : (ISNULL() 여기) 기능을 사용하기가 매우 나쁘다를 predicats. 엔진은 기존 색인을 적용 할 수 없습니다. sargable에 대해 읽어보십시오. 한 가지 예외는 CAST(SomeDateTime AS DATE)이며 이는 허용됩니다.

아무데도 오늘은 필요하지 않으면 다음과 같이 말하면 충분합니다. 오늘 행이 생성되었거나 오늘 수정되었습니다.

중요ModifiedDateCreatedDate에 대한 인덱스가 있는지 확인하십시오!

+0

안녕하세요 @ Shnugo, OR 내가 생각하는 성능에 영향을 미칠 것입니다 그리고 그 두 개의 열에 대한 색인이 있습니다 – jankenshin2004

+0

@ jankenshin2004 왜 그렇게 생각하십니까? 간단한 불리언 논리 (AND/OR ...)가 가장 빠릅니다. 두 열에 모두 인덱스가 있으면 수백만 개의 행이 있더라도 평등에 대한 검사가 빠르다는 것이 좋습니다 ... – Shnugo

+0

지금 내가 경험 한 데이터를 기반으로 볼 때 위의 스크립트를 사용하면 OR 실행 시간이 너무 멀고 다르다. – jankenshin2004

0

이 당신이 찾고있는 무엇인가 : 나는 아래에 이러한 스크립트를 시도? 그냥 오늘 (= GETDATE()) 에 대해이 필요한 경우

SELECT 
    someColumn1, 
    someColumn2, 
    CASE 
     WHEN modifiedDate IS NULL THEN createdDate 
     ELSE modifiedDate 
    END AS someDate 
FROM someTable 
+0

에 대해 읽으십시오. 모든 레코드를 얻을 것이기 때문에 아니오라고 생각합니다. 위의 스크립트는 필터가 없습니다 .. 만약 내가 이것을 사용한다면 수백만 개의 레코드를 반환 할 것입니다. 오늘의 기록이 필요합니다 – jankenshin2004

+0

몇 가지 샘플 데이터를 제공해 주시겠습니까? – dhaninugraha

0

SELECT * ISNULL 표 FROM TSQL에 ISNULL() 함수를 사용할 수있다

((날짜, ModifiedDate를) 변환 변환 (날짜, CreatedDate)) = CONVERT (날짜, GETDATE())

+0

기존 답변을 읽어주십시오 ... WHERE 절에서 ISNULL() 사용법은 * sargable *이 아닙니다. 엔진이 인덱스를 적용 할 수 없습니다. 이것은 피하는 것이 좋습니다. – Shnugo

+0

정보를 제공해 주셔서 감사합니다. COALESCE() 함수는 어떻게 작동합니까? 그것은 또한 인덱스의 사용을 망칠 것인가? –

+0

예, 거의 모든 기능이 최적화 프로그램을 숨 깁니다. 'CAST (SomeDateTime AS DATE) '와 같은 예외는 거의 없지만 대부분의 경우이 함수는 * 행 단위 * 실행으로 이어진다 ... – Shnugo

0

함수를 사용하면 인덱스에 영향을 주므로 효율적이라면이 함수를 사용해보십시오.

SELECT * 
FROM table 
WHERE ModifiedDate IS NOT NULL 
AND CONVERT(date,ModifiedDate) = CONVERT(date, getdate() 
UNION 
SELECT * 
FROM table 
WHERE ModifiedDate IS NULL 
AND CONVERT(date,CreatedDate) = CONVERT(date, getdate() 
관련 문제