0

我目前正在研究一个查询,该查询将与共享点结合使用以运行报告。我有一个查询,我知道可以使用 Oracle,但我工作的公司正在运行 SQL Server 2005。

报告将做的是让人们能够选择任何日期和时间,并为该特定操作提供计数。问题是时间戳有很大的差距(因为产品需要一点时间才能进入下一个操作)。日期类型是 varchar,所以我使用子字符串来解析出年、月、日和时间。我有可用的样本数据

查看报告的人希望能够在这个时间和日期说出有多少单位经历了这次行动。

我知道这很令人困惑,如果您需要任何澄清,请告诉我。

这是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
4

1 回答 1

2

您的问题的答案是 SQL Server 中的 datepart() 函数。这将允许您从日期中提取分钟和小时。

较难的部分是“按级别连接”部分。这是如何使用的?您可能需要使用递归 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. 替换了获取数字列表的方法,使用 row_number() 而不是按级别连接
  3. 使交叉连接显式
  4. 将 order by 移动到外部查询,因为 SQL Server 和 Oracle 都不保证子查询中 order by 的结果(并且 SQL Server 不允许它,除非您有“TOP”查询)
于 2012-07-10T18:53:48.590 回答