2012-07-10 11 views
0

현재 보고서를 실행하기 위해 공유 지점과의 교차점에 사용될 쿼리를 작성하고 있습니다. Oracle에서 작동하는 쿼리가 있지만 SQL Server 2005를 실행중인 회사는 SQL Server 2005를 실행하고 있습니다.내역보고의 날짜 및 시간을 계산합니다.

보고서에서 수행 할 작업에는 날짜와 시간을 선택할 수있는 권한이 부여됩니다. 특정 작업에 대해 계산하십시오. 문제는 타임 스탬프에 큰 차이가 있다는 것입니다 (제품이 다음 작업을 수행하는 데 약간의 시간이 걸리기 때문에). 날짜 유형은 varchar이므로 하위 문자열을 사용하여 년, 월, 일 및 시간을 구문 분석합니다. 나는 sample data을 사용할 수 있습니다.

보고서를 보는 사람들은이 시간과 날에이 작업을 수행 한 단위 수를 말하기를 원합니다.

나는 혼란 스럽다는 것을 알고 있습니다. 어떤 설명이 필요한지 알려주세요. 여기

는 질문에 대한 대답은 SQL Server에서 DATEPART() 함수 오라클 구문

SELECT T3.PAYMENT_DATE, T3."Hr", T3."Min", 
     (SELECT COUNT(*) 
     FROM INVOICE_ARCHIVE T4 
     WHERE TO_NUMBER(TO_CHAR(T4.PAYMENT_DATE, 'MM')) <= T3."Hr" 
     AND TO_NUMBER(TO_CHAR(T4.PAYMENT_DATE, 'DD')) <= T3."Min") AS "NUM" 
FROM(SELECT T1.PAYMENT_DATE, T2."Hr", T2."Min" 
    FROM (SELECT (FLOOR((LEVEL + 359)/60)) AS "Hr", 
        MOD((LEVEL + 359), 60) AS "Min" 
      FROM dual CONNECT BY LEVEL <= 961) T2, INVOICE_ARCHIVE T1 
    ORDER BY T1.PAYMENT_DATE, T2."Hr", T2."Min") T3 
+0

일/시간 당 몇 개인지보고 싶을 때 범위를 원하거나 선택한 기간까지 롤업 했습니까? 기본 테이블이 무엇인지 명확하지 않기 때문에 원래 테이블 (또는 익명 버전)의 샘플을 제공해주십시오. varchar로 변환하여 날짜와 시간의 일부를 분리하는 것이 이상적인 솔루션이 아닙니다. 실제 날짜 유형이있는 경우 더 나은 방법을 사용할 수 있습니다. 또한 인라인 하위 선택 (프로그래머 성능상의 이유로 컴파일러가 아닌) 대신 CTE를 사용하는 방법을 고려해야합니다. –

+0

이것은 좋은 질문입니다. 여러분이 기쁘게 생각합니다. 내가 이해하는 것으로부터, 그들은 범위를 원할 것입니다. 이 범위는 오전 6시에 시작되어 그들이 선택한 시간에 종료됩니다. 우리는 과거의 모든 데이터를 다른 테이블에 가지고 있지만 그날의 합계에 대한 정보 만 가지고 있습니다. 이제 우리가 취해야 할 조치의 과정은 우리가 필요로하는 데이터를 (시간 기준으로) 입력하고 별도의 테이블로 내보내기 위해 자바 코드를 편집하여 하나의 테이블에서 모든 정보를 가져 오도록하는 것이라고 생각합니다. ; 우리는 또한 이것이 서버에 더 빠르고 덜 부담이되기를 바라고 있습니다. –

답변

2

입니다. 이렇게하면 날짜로부터 분과 시간을 추출 할 수 있습니다.

어려운 부분은 "연결 수준"부분입니다. 어떻게 사용 되는가? 이를 처리하기 위해 재귀 CTE를 사용해야 할 수도 있습니다.

스펜서에서 약간의 힌트와 함께

, 다음은 쿼리에 대해 충분하다 : 대신 TO_CHAR의)

  1. 이 날짜 부분 (사용 날짜 연산을 변경 :

    SELECT T3.PAYMENT_DATE, T3."Hr", T3."Min", 
         (SELECT COUNT(*) 
         FROM INVOICE_ARCHIVE T4 
         WHERE datepart(month, T4.PAYMENT_DATE) <= T3."Hr" AND 
           datepart(day, T4.PAYMENT_DATE, 'DD') <= T3."Min" 
         ) AS "NUM" 
    FROM (SELECT T1.PAYMENT_DATE, T2."Hr", T2."Min" 
         FROM (SELECT top 961 (FLOOR((LEVEL + 359)/60)) AS "Hr", 
            MOD((LEVEL + 359), 60) AS "Min" 
          FROM (select top 961 row_number() over (order by (select NULL)) as level 
            from invoice_archive 
           ) t 
          ) T2 cross join 
          INVOICE_ARCHIVE T1 
        ) T3 
    ORDER BY T3.PAYMENT_DATE, T3."Hr", T3."Min" 
    

    나는 다음과 같이 변경했다().

  2. 는 SQL 서버 나 오라클 보증도 있기 때문에,
  3. 가 외부 쿼리에 의해 순서를 이전 십자가가 명시 적으로 가입 제작 수준
  4. 에 의해 연결 대신) ROW_NUMBER를 (사용하여, 번호 목록을 가져 오기위한 방법을 대체 하위 쿼리에 의한 주문 결과 (사용자가 "TOP"쿼리를 사용하지 않는 한 SQL Server는 허용하지 않음)
+0

"from dual by connect"는 961 정수 값을 생성하는 편리한 방법으로 사용됩니다 : 1,2,3, ..., 961 – spencer7593

+0

이 구문 AS 시간 (수)가 아니라 를 트릭을 보였다 ( 이 번호 UNION AS 6을 선택 ALL SELECT 번호 + 1 시간 FROM WHERE 번호 <22 ) 미네소타 (수) ( 가 UNION 번호 0을 선택 ALL SELECT 번호 + 1 망간 FROM WHERE 번호 <59 )와 같은 HourMinute AS ( AS SELECT hr.Number [HR] , mn.Number AS [분] FRH에서 –

관련 문제