2012-07-10 55 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

相关问题