2012-07-10 42 views
0

我目前正在處理將用於與共享點交接以運行報告的查詢。我有一個查詢,我知道將與Oracle合作,但是我工作的公司正在運行SQL Server 2005.計數歷史報告的日期和時間

報告將執行的操作是讓該人員能夠選擇任何日期和時間,計算該特定操作。問題在於時間戳存在很大差距(因爲產品需要一點時間才能進入下一個操作)。日期類型是varchar,所以我使用子字符串來分析年,月,日和時間。我有sample data可用。

查看報告的人希望能夠在這個時間和日期說出有多少單位通過此操作。

我知道這是令人困惑,讓我知道如果你需要任何澄清。

這裏是oracle語法

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,而不是內聯子選擇(出於程序員性能原因,而不是編譯器性能原因)。 – 2012-07-10 19:04:45

+0

這是一個很好的問題,我很高興你問。據我所知,他們會想要一個範圍。該範圍將在早上6點開始,並在任何時間結束。我們把所有的歷史數據都放在另一張桌子上,但它只有一天的總和信息。我認爲現在我們要採取的行動是編輯java代碼以輸入我們需要的數據(以每小時爲單位)並將其導出到單獨的表中,以便我們從一個表中提取所有信息;我們也希望這將是一個更快,更少的服務器稅。 – 2012-07-11 16:03:13

回答

2

的回答你的問題是SQL Server日期部分()函數。這將允許您從日期中提取分鐘和小時。

較難的部分是「按層連接」部分。這是如何使用?您可能需要使用遞歸CTE來處理此問題。

與斯賓塞的小提示,以下內容可能足以滿足您的查詢:

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" 

我做了以下修改:

  1. 變更之日起算術使用DATEPART(),而不是TO_CHAR ()。
  2. 替換的方法所做出的交叉聯接明確的級別
  3. 得到號的列表,通過使用ROW_NUMBER(),而不是連接
  4. 通過移動以外部查詢,因爲無論是SQL Server的也不甲骨文保證在子查詢中排序的結果(除非您有「TOP」查詢,否則SQL Server不允許它)
+0

「通過級別進行雙重連接」用作生成961個整數值的便捷方式:1,2,3,...,961 – spencer7593 2012-07-10 19:27:18

+0

此語法似乎達到目的以及 WITH HR(號碼) ( SELECT 6 AS編號 UNION ALL SELECT數+ 1 FROM HR WHERE數<22 ) Mn(數) AS ( SELECT 0 AS編號 UNION ALL SELECT數+ 1 選自Mn WHERE數<59 ) HourMinute AS ( SELECT hr.Number AS [HR] ,mn.Number AS [分鐘] 從人力資源 – 2012-07-11 15:55:07