我目前正在开发一个查询,该查询将与share-point联合使用以运行报告。我有一个我知道可以与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 :(得分:2)
您的问题的答案是SQL Server中的datepart()函数。这样您就可以从日期中提取分钟和小时。
更难的部分是&#34;按级别连接&#34;一部分。这是怎么用的?您可能需要使用递归CTE来处理此问题。
使用spencer的小提示,以下内容可能足以满足您的查询:
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"
我做了以下更改: