2012-10-25 2 views
2

사용하여 델파이 2010 (파이어 버드 [테스트], MS SQL 서버, 오라클 [생산]) 변환 오류, SQL에 PARAMS를 사용하는 경우

다음

내가 무엇입니까

SELECT p.script_no, MIN(p.start_Time) as startTime, MAX(p.end_Time) as endTime, 
SUM(p.duration) as TotalDuration 
FROM phase_times p 
WHERE (p.script_no=:scriptNo) AND (Trunc(p.start_time) >= :beginDateRange) AND (Trunc(p.start_time) <= :endDateRange) 
GROUP BY p.script_no 



ParamByName('beginDateRange').AsDate:= Date - 30; 
ParamByName('endDateRange').AsDate:= Date; 

내 SQL입니다 내 datetime 필드가 "10/25/2012 9:20:49 AM"형식의 데이터베이스에 있기 때문에 "문자열에서 변환 오류 - 10-25-2012"및 이유는 확실하지 않습니다.

다음과 같이 변경하면 : ParamByName ('beginDateRange'). AsString : = formatDateTime ('mm/dd/yyyy', Date - 30) ..... "문자열에서 변환 오류가 발생합니다. - 10/25/2012 "

이 오류를 재검토해도 새로운 방법이 없었습니다. 아이디어가 있습니까?

+3

은'start_Time' 필드의 데이터 형식은 무엇입니까 그렇다면, TRUNC의 사용을 다시? (VAR) CHAR 또는 TIMESTAMP? – ain

+0

시작 날짜와 종료 날짜 필드 모두 datetime입니다. –

+0

@Jake - Firebird에는 datetime 데이터 유형이 없습니다. –

답변

5

Interbase 6.0 매뉴얼, Embedded SQL 가이드, 7 장, Firebird는 YYYY-MM-DD와 YYYY-MM-DD HH : MM : SS.qqq에서의 변환을 지원합니다. 나는 또한 변환을 위해 아메리칸 스타일의 속기 날짜 (예 : 1-JAN-2012)를 지원한다고 믿습니다.

일부 로캘 종속 변환이 지원 될 수 있지만 일반적으로 문자열 대신 실제 날짜/타임 스탬프 유형을 사용합니다.

UPDATE 나는 처음 쿼리에서 TRUNC를 발견하지 않았다 :이 기능 만 manual entry for TRUNC를 참조 숫자에서 작동로는 변환 오류의 원인이다.

귀하의 의견 (그리고 ain의 답변)을 감안할 때 나는 당신이 날짜 부분에만 관심이 있고 시간을 무시하고 싶다고 가정합니다.

CAST(<your-timestamp-field> AS DATE) 

그리고 조건 (Trunc(p.start_time) >= :beginDateRange) AND (Trunc(p.start_time) <= :endDateRange)에 :

CAST(p.start_time AS DATE) BETWEEN :beginDateRange AND :endDateRange 
+0

문자열이 아닌 DateTime 필드를 사용합니다. 내 게시물에 두 번째 예제를 추가하여 AsString에 대한 매개 변수를 변경하면 동일한 오류가 발생합니다. –

+0

그런 다음 문제는 'TRUNC'를 쿼리에서 사용하는 것입니다. 숫자가 아니라 숫자 만 변환하기 때문입니다. 나는 오류가 실제로 매개 변수 대신에'TRUNC'에서의 변환에 관한 것 같아요. http://www.firebirdsql.org/refdocs/langrefupd25-intfunc-trunc.html –

+0

을 참조하십시오. 문제를 일으키는 trunc 인 것 같습니다. trunc 함수를 없애고 true를 가진 레코드를 선택하려면 어떻게해야합니까? start_date> = : beginDateRange 및 <= : endDateRange. 나는 날짜의 시간 부분에 관심이있다. ParamByName ('beginDateRange')을 사용하면 진정한 결과를 얻을 수 있습니까? AsDate : = Date - 30; 및 ParamByName ('endDateRange'). AsDate : = Date; --- 고맙습니다 –

1

문자열이 12 시간 형식 인 경우 Firebird는 문자열에서 날짜 및 시간 값으로의 변환을 지원하지 않습니다. 'dd.mm.yyyy hh : mm : ss'또는 'mm/dd/yyyy hh : mm : ss'형식을 사용하십시오.

+0

위의 두 개의 다른 예제에서 필자는 문자열을 사용하지 않습니다. 내 시작 및 끝 필드는 모두 DateTime 필드입니다. 내 매개 변수는 asDateTimes (심지어 asDate 시도했다) 값을 받고있다. 나는 asString을 사용하여 동일한 에러를 얻었습니다. –

0

날짜/시간 변환 문자열은 대개 사용자의 로캘을 사용합니다. 로케일의 날짜 부분과 일치하지 않는 문자열로 날짜/시간 변환 함수를 입력하면 비슷한 오류가 발생합니다.

또한 "10/25/2012"와 같은 날짜/시간 값은 로케일에 따라 다릅니다. 따라서 내 Locale (예 : Mine)과 다른 컴퓨터에서 프로그램을 실행하는 경우 "10/25/2012"를 사용하면 실패 할 가능성이 있습니다.

내가 두 가지 옵션을 제시 독립적 인 로케일이 될하려면 날짜/시간 문자열을 지정하기위한, 사용 StrToDateTime 8601
  • 사용 ISO 지정 TFormatSettings을

    • 을 (하지만 델파이가 지원 생각하지 않습니다 ...)

    MS Sql, Excel 등과 같은 BTW 프로그램은 ISO 8601의 날짜를 허용합니다. 그러나 FB를 확인해야합니다. 이에 대해

    : 내 날짜 필드 이후

    이 ... 데이터베이스에서 "2012년 10월 25일 오전 9시 20분 49초"형식으로되어 있습니다 ...

    날짜/시간 필드의 내부 저장은 다른 DB 엔진간에 다릅니다. 귀하의 DB 관리 소프트웨어 (귀하의 경우 "10/25/2012 9:20:49 AM")는 데이터 필드의 문자열 표현으로, 사용자에 따라 일반적으로 (다시) 형식화됩니다. 로케일

  • +0

    AsDate를 사용하는 것은 DB 드라이버가 필요에 따라 고유 한 형식을 사용하여 필요한 변환을 처리하도록하는 것입니다. 'AsDate'가 잘못된 문자열 변환을하고 있다면'TParam' 버그이거나 DB 드라이버 버그입니다. –

    +0

    문자열을 사용하지 않고 문자열이 아닌 DateTime 필드를 사용합니다. 내 게시물에 두 번째 예제를 추가하여 Asams로 매개 변수를 변경하면 동일한 오류가 발생한다는 것을 보여줍니다. –

    +0

    @ JakeSnake : 그래서 Remy Lebeau가 맞을 수도 있습니다 - DB 드라이버 버그 일 수 있습니까? 데이터베이스에 액세스하기 위해 사용하는 구성 요소는 무엇입니까? –

    관련 문제