2009-03-02 3 views
3

에 대한 레코드를 표시하는 방법은 내가 SQL : 30 일 밖에

SELECT * from Results 
WHERE DATEDIFF(d,Date,getdate())<30 

를 사용하지만이 함께 오류를 가진 것 같다하려고 노력했다.

제출 된 각 레코드는 30 일만 표시됩니다. 구문이 올바른지 알 수 있습니까?

크게 감사

, 스탠

+0

오류가 발생 했습니까? 아니면 올바른 값을 얻지 못하고 있습니까? – johnc

+0

어떤 RDMS를 사용하고 있습니까? – ahsteele

+0

Microsoft Frontpage를 사용하고 있습니다. –

답변

0

귀하의 질의 사운드를 보인다. 현재 실행중인 오류는 무엇입니까?

+0

연결에 실패했습니다. 정의되지 않은 함수 'getdate' –

13

구문 확인을 보이는,하지만 당신은 '인용'Date해야 할 수 있습니다

SELECT * from Results WHERE DATEDIFF(d, [Date], getdate()) < 30 

당신이 결과에서 날짜라는 컬럼을 가지고 있습니까? 이 뜻하는 반면, 인덱스를 사용할 수 없습니다 BTW

:

SELECT * from Results WHERE [Date] >= DATEADD(d, -30, getdate()) 
+0

예. 나는 Date라는 이름의 cloumn을 가지고있다. 감사합니다. –

+2

색인 힌트에 대해 투표가 완료되었습니다. Thx – AngryHacker

+0

+1에 대한 쿼리 최적화 –

2

Microsoft Access 데이터베이스를 사용하는 경우는,이 ​​함수는 현재 날짜를 얻을 수는 날짜()입니다 getdate() (SQL Server 용)이 아닙니다.

3

이 시도 :

SELECT * 
FROM results 
WHERE ([Date] between DateAdd("d", -30, Date()) and Date()) 

또 다른 헤드 업을. Access에서 필드 "Date"의 이름을 지정하는 것은 일반적으로 좋지 않습니다. 예약어이므로 모든 쿼리에서 대괄호 []를 사용해야합니다.

+0

아, 추가 의무가 있습니다. "SELECT *"를하지 말고 원하는 특정 필드를 나열하십시오. 내 반응의 구문은 필자가 필요로하는 분야를 모르기 때문에 그 예일뿐입니다. – JohnFx

0

데이터베이스로 SQL Server를 지정하지 않았습니다. Access에서 DateAdd의 구문은 DateAdd ("d", 1, "31-Jan-95")입니다.

+0

엄밀히 말하자면, * Jet *에서 구문입니다. Access에는 SQL 구문이 없으며 Jet SQL 구문 만 있습니다. –

+0

'엄격히'? 아니요, 'Jet'및 'Microsoft Access Engine'이라는 용어를 사용하고 있습니다. '액세스'라는 단어가 엄격한 정의에 포함되어 있다고 가정하면 'Access SQL'을 구어체로 언급하면 ​​누구나 의미를 알 수 있습니다. – onedaywhen

+0

많은 사람들이 그렇게합니다. 그러나 데이터베이스 엔진 (Jet)과 개발 플랫폼 (Access)을 구별하지 않는 많은 사람들의 토론과 마음을 혼란스럽게합니다. –

5

먼저 (이 스레드의 대부분의 응답과 함께) SQL 변형이 혼합되어 있습니다. 당신은 SQL Server에 관해서 아무 말도하지 않았지만 SQL Server 구문 (즉, GetDate()) 사용에 대한 권장 사항을 얻고 있습니다.

JohnFx에서 대답은 당신에게 올바른 제트 SQL 구문을 제공합니다

SELECT * 
FROM results 
WHERE ([Date] between DateAdd("d", -30, Date()) and Date()) 

을하지만 그는 필드 "날짜"를 명명하는 액세스/제트에 정말 나쁜 것이 올바른 것입니다. WHERE 절은 향상 될 수 있습니다

WHERE (results.Date between DateAdd("d", -30, Date()) and Date()) 

하지만 확실히 말할 수 없다 - 내가 지금 이런 종류의 문제가 발생하지 않을 것입니다 필드 "날짜"이름을하지 않을 것입니다.

그러나 정수 부분이 날짜와 소수 부분을 나타내는 형식으로 Jet에 날짜를 저장하는 경우 더 간단한 버전이있을 수 있습니다. (몇 주 또는 몇 달 또는 분기 반대) 날짜를 처리 할 때 그 때문에, 직접 그들에 날짜 계산을 수행 할 수 있습니다

WHERE results.Date BETWEEN results.Date-30 AND Date() 

이것은 JohnFx의 참조 DateDiff 정확히 같은 결과를() 버전을 줄 것이다, 각 행에 대해 DateAdd 함수를 호출 할 필요는 없습니다.

중요한 것은 Jet 데이터베이스의 올바른 구문을 사용하는 것이므로 DateAdd()의 첫 번째 인수는 문자열 값 ("d")이고 SQL Server 기능 (GetDate()), 대신 동일한 목적 (Date())에 대한 Jet 함수를 사용해야합니다. 그러나 당신이 할 필요가 없을 때 SQL에서 Jet/Access 함수를 사용하는 것을 피하는 것도 좋은 생각입니다. 그 때문에 "results.Date-30"버전이 DateAdd() 버전보다 나을 것이라고 생각합니다 .

다음은 SQL과 관련된 답변을 게시하는 사람들이 질문자가 SQL을 실행하는 데 사용하는 데이터베이스 엔진에주의를 기울 이길 바랍니다. 이 포스터가 질문을주의 깊게 읽지 않았기 때문에 잘못된 답변이 많이 발견되었습니다 (키워드와 관련하여 어떤 데이터베이스 엔진이 관련되었는지는 분명했습니다).

+0

초기 문항에서 다른 구문을 제공하게 된 태그를 놓쳤습니다. 그것은 키워드가 Jet SQL 구문임을 알게 해주었습니다. – ahsteele

+0

안녕 데이비드, 통찰력과 설명을 주셔서 감사합니다. 나는 모든 고문에게 혼란을 피하기 위해 더 명확한 질문을 던져야했다. Jets SQL SQL server 기능에 따라 코드의 이름을 변경하고 수정했습니다. 이제 작동합니다! 대단히 감사합니다. =) –

+0

"더 나은"은 보는 사람의 눈에 있습니다. 시간 과립 "d"= 일이 더 명확하기 때문에 나는 눈에 더한 DateAdd 버전을 발견합니다. – onedaywhen

관련 문제