2011-07-29 3 views
3

질문이 있습니다. 필드 열이있는 SQL Server 2008 테이블이 있습니다. 내가 예를 들어, 다음 날짜가 :SQL 날짜 질문

1/1/2001 
5/5/2004 
8/5/2009 
10/7/2011 
5/5/2012 
1/13/2014 

이드 모든 날짜를 보여줄 수 있기를> = 현재 날짜 (7/29/2011)뿐만 아니라 < 현재 날짜입니다 가장 큰 테이블 날짜입니다. 이 예에서 결과는 모든 날짜 >= 8/5/2009이됩니다.

나를 도울 수있는 사람이 있습니까?

+0

내가 그가 뭘 찾고 있는지 더 잘 설명하기 위해 설명을 편집했습니다. –

+0

요구 사항을 명확하게 설명해 주시겠습니까? "현재 날짜 뒤의 날짜"라고 말하면 "어제"를 의미합니까? 아니면 "오늘 테이블에있는 가장 최근 날짜입니까?"라는 뜻입니까? –

+1

사용하는 RDBMS (예 : SQL Server) 외에도 어떤 버전을 지정해 주시겠습니까? 또한 데이터 유형은 date/datetime/smalldatetime이거나 char/varchar로 저장되어 있습니까? 그리고 예상 한 결과를 단어 문제가 아닌 표 형식으로 보여줄 수 있습니까? –

답변

3

정확하게 이해하면 현재 날짜 이전의 날짜를 포함하고 싶습니다. GETDATE()는 현재 날짜를 시간과 함께 가져옵니다. 당신이 그걸로 괜찮 으면, 이것은 작동해야합니다. 그렇지 않으면, 당신은 GETDATE에서 불과 날짜()

SELECT TheDate 
FROM DateTable 
WHERE TheDate >= (SELECT MAX(TheDate) FROM DateTable WHERE TheDate < GETDATE()) 

이 현재 날짜 이전 가장 최근 날짜의 모든 날짜보다 크거나 같은 얻는다을 구문 분석 할 수 있습니다.

+0

예, 이것은 OP가 원하는 것보다 훨씬 가깝습니다. –

0

나는 완전히 이해할 수는 없지만, 관련 날짜 사이에있는 것처럼 보입니다. 아니면 내가 누락 된 것이 더 있습니까?

+0

나는 그가 현재 날짜 바로 앞의 날짜와 현재 날짜 이후의 모든 날짜를 조회하려고하고 있다고 생각한다. –

0

그것은 다음과 같이 테이블이 DateTable라고하고 필드가 TheDate라고 할 가정 :

SELECT TheDate 
FROM DateTable 
WHERE TheDate >= DATEADD(d, -2, GETDATE()) 

행운을 빕니다!

+0

나는 그가 오늘 날짜 이전에 반드시 첫 번째 엔트리를 원한다고 믿는다. (그래서 그는 8/5/09가 반환되기를 원한다. 그래서 당신의 질문에는 그렇지 않다.) –

+0

아, 재미있다. –

4
select max(date) [date] from table where date < getdate() 
union 
select date from table where date >= getdate() 
+0

이 작업을 수행 할 수 있지만 조합이없는 솔루션이 더 좋을 것으로 보입니다. – Narnian

+0

하지만 중첩 된 선택은 조합보다 낫지 않습니까? – dizzwave

0

사용중인 SQL 서버에 따라 다릅니다. 포스트 그레스에서, 예를 들어, 당신은

SELECT fields FROM table WHERE date_field >= CURRENT_DATE - 1 

그러나 다른 SQL 서버가 지정하는 다른 방법이 "어제"와 같은 뭔가가 필요

0
SELECT d1.* 
FROM dates d1 
    LEFT JOIN dates d2 ON d1.Date < d2.Date AND d2.Date < GETDATE() 
WHERE d2.Date IS NULL 

는 설명 :

이에 대한 모든 날짜를 선택 오늘부터 검사를받는 날짜보다 빠르거나 늦은 날짜는 존재하지 않습니다.

0

느슨한 내러티브 및 알 수없는 데이터 유형을 기반으로 한 추측이 많습니다.

DECLARE @t TABLE(d DATE); 

INSERT @t SELECT '20010101' 
UNION ALL SELECT '20040505' 
UNION ALL SELECT '20090805' 
UNION ALL SELECT '20111007' 
UNION ALL SELECT '20120505' 
UNION ALL SELECT '20140113'; 

DECLARE @now DATE = SYSDATETIME(); 

WITH t AS 
(
    SELECT d, rn = ROW_NUMBER() OVER (ORDER BY d) 
    FROM @t 
) 
SELECT t.d 
    FROM t LEFT OUTER JOIN t AS x 
    ON t.rn = x.rn - 1 
    WHERE COALESCE(x.d, @now) >= @now 
    ORDER BY t.d;