2013-04-09 2 views
1

mdb 파일로 작업하는 Jet 엔진에 연결하는 ADO 레코드 집합 필터 식에서 날짜 부분을 추출하는 방법을 알아 내려고 많은 시간을 보냈습니다. 문제는 SQL의 액세스 맛에 대해 언급 한 많은 것들 (예 : 날짜 기능)이 오류를 발생시키지 않는다는 것입니다. # mm/dd/yyyy hh : mm : ss # 형식으로 날짜를 비교하면 작동하지만 잘못된 결과가 나타납니다. 필터에 대해 어떤 종류의 표현이 작동하는지, 그리고 어떤 기능을 사용할 수 있는지에 대한 신뢰할만한 정보원이 있습니까? 나는 마이크로 소프트 JET 4.0 OLE DB 공급자를 선택할 때ADO 레코드 집합 필터 쿼리의 구문에 대한 정보

UPDATE

사용되는 버전입니다. 일반적으로 필터 조건은 SQL 쿼리에서 WHERE 키워드 다음에 오는 쿼리 부분과 동일한 구문을 사용할 수 있습니다. 내 작업은 시간 스탬프의 날짜 부분을 비교하여 필터링 된 테이블 대신 쿼리를 사용하기로 결정했지만 다음 예제는 SQL 쿼리의 일부인 경우 (WHERE 이후)에 발생하고 이 발생하면 "응용 프로그램이 잘못된 유형의 허용 범위를 벗어난, 또는 서로 " 오류와 충돌이

format(TimeStamp,"yyyy/mm/dd")=format(#04/11/2013#,"yyyy/mm/dd") 

그래서 내가 WHERE 및 필터 구문 사이에 분명한 차이가있다 볼 수있는 필터의 내용을 때,하지만 난 할 수 정확한 설명을 찾지 못했습니다.

+0

당신이 사용하고있는 MS 액세스의 버전을 표시하시기 바랍니다. 또한 기능, 필드, 필드 형식 및 발생하는 오류의 예를 제시 할 수 있다면 도움이 될 것입니다. – Taliesin

+0

@ Taliesin, 질문을 업데이 트 – Maksee

답변

2

실제로 Access 데이터베이스 엔진 (ACE)에 대한 ADO 쿼리에서 WHERE Format([TimeStamp]...이 작동하지만 실제로는 매우 놀랍습니다.

Microsoft의 일부 기능 사용에 대한 자세한 내용은 Microsoft의 설명서에서 찾기가 어려울 수도 있습니다. 스택 오버플로 같은 사이트를 비즈니스에서 유지하는 데 도움이되는 것 같습니다. ;)

질문에 대해서는 Format()은 VBA 함수이며 Access 응용 프로그램 외부의 표현식에서 항상 사용할 수 없기 때문에이 문맥에서 Format()을 사용하면 실패합니다. 그러나 다음 테스트 결과를 보면 ...

rst.Filter = "[TimeStamp] >= #2013/04/11# AND [TimeStamp]<#2013/04/12#" 

... 작동하지 않습니다. (- 00:00:00 - 시간 후 자정 datetime 값에 대해 지정하지 않으면 가정한다.)

테스트 데이터 :

ID TimeStamp 
1 2013-04-10 21:22:00 
2 2013-04-11 02:34:56 
3 2013-04-11 04:45:15 

시험 번호 :

Sub foo() 
Dim con As ADODB.Connection, rst As ADODB.Recordset 

Set con = New ADODB.Connection 
con.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data source=C:\Users\Gord\Desktop\Database1.accdb;" 
Set rst = New ADODB.Recordset 

Debug.Print "Test 1: WHERE Format([TimeStamp]..." 
rst.Open _ 
     "SELECT * FROM [TimeStampData] " & _ 
     "WHERE Format([TimeStamp], ""yyyy/mm/dd"") = Format(#2013/04/11#, ""yyyy/mm/dd"")", _ 
     con, adOpenKeyset, adLockOptimistic 
Debug.Print "Records returned: " & rst.RecordCount 
rst.Close 
Debug.Print 

Debug.Print "Test 2: Filter" 
rst.Open "SELECT * FROM [TimeStampData]", con, adOpenKeyset, adLockOptimistic 
Debug.Print "Total records: " & rst.RecordCount 
rst.Filter = "[TimeStamp] >= #2013/04/11# AND [TimeStamp]<#2013/04/12#" 
Debug.Print "Filtered records: " & rst.RecordCount 
rst.Close 

Set rst = Nothing 
con.Close 
Set con = Nothing 
End Sub 

시험 결과 :

Test 1: WHERE Format([TimeStamp]... 
Records returned: 2 

Test 2: Filter 
Total records: 3 
Filtered records: 2 
+0

내가 Jet (MM/DD/DD 형식을 사용하는 워드 프로세서 (http://technet.microsoft.com/en-us/library/cc966377.aspx)에서 보았지만 필터가 작동하지 않는 것 같습니다. YYYY 형식이지만 YYYY/MM/DD는 다르지만 작동합니다. – Maksee

+1

@Maksee 초기에는 Jet 데이터베이스 엔진이 날짜 리터럴을 m/d/y 형식으로 만 처리했습니다. 어딘가에 (아마도 Jet_3 또는 Jet_4의 릴리스와 함께) yyyy/mm/dd 날짜 리터럴을 받아들이 기 시작했지만 문서의 대부분은 여전히 ​​m/d/y 형식만을 참조합니다. –

0

(VBA) ADO 필터 구문에 대한 간단한 설명 (DAO에도 적용됨) :

필터는 다음과 같이 지정해야합니다. "[Fieldname] =" 여기서 Fieldname은 레코드 집합의 필드 이름으로 기존 문자열 이름으로 지정할 수 있습니다. filtervalue가 명시적인 SQL WHERE 문으로 변환 될 때 문자열이 아닌 모든 문자열이 항상 문자열로 변환됩니다 (Allways a string).

유효한 필터는 다음과 같습니다

rst.Filter="[TimeStamp] = #2013/04/12#" '(Mind the hashes as a date is expected. Peculiarly all localised notations are accepted!) 

rst.Filter="[TimeStamp] = #" & strDatevalue & "#" 'Where strDatevalue is a datevalue as text. 

는 따라서이 작동합니다

rst.Filter="[TimeStamp] = #" & format(#04/11/2013#,"mm/dd"/yyyy) & "#" 
'Mind: Access expects here an American standard date format, i.e. month/day/year 
'(In that case you could even leave the hashes away!) 

IF