2011-06-06 127 views
0

我有一个查询从1分钟到任何其他时间框架聚合(压缩)数据,它完美的作品。修改查询sql

Use StockDataFromSella; 
DECLARE @D1 DateTime 
DECLARE @D2 DateTime 
DECLARE @Interval FLOAT 

SET @D1 = '2008-09-21T09:00:00.000' 
SET @D2 = '2010-10-20T17:30:00.000' 
SET @Interval = 15 

;WITH 
L0 AS (SELECT 1 AS c UNION ALL SELECT 1), 
L1 AS (SELECT 1 AS c FROM L0 A CROSS JOIN L0 B), 
L2 AS (SELECT 1 AS c FROM L1 A CROSS JOIN L1 B), 
L3 AS (SELECT 1 AS c FROM L2 A CROSS JOIN L2 B), 
L4 AS (SELECT 1 AS c FROM L3 A CROSS JOIN L3 B), 
Nums AS (SELECT ROW_NUMBER() OVER (ORDER BY (SELECT 0)) AS i FROM L4), 
Ranges AS( 
SELECT 
     DATEADD(MINUTE,@Interval*(i-1),@D1) AS StartRange, 
     DATEADD(MINUTE,@Interval*i,@D1) AS NextRange 
FROM Nums where i <= 1+CEILING(DATEDIFF(MINUTE,@D1,@D2)/@Interval)) 
,cte AS ( 
SELECT 
    * 
    ,ROW_NUMBER() OVER (PARTITION BY Simbolo,r.StartRange ORDER BY [DataOra])  AS RN_ASC 
    ,ROW_NUMBER() OVER (PARTITION BY Simbolo,r.StartRange ORDER BY [DataOra] DESC) AS RN_DESC 
FROM Ranges r 
JOIN dbo.tbl1MinENI p ON p.[DataOra] >= r.StartRange and p.[DataOra] < r.NextRange) 
SELECT 
     Simbolo, 
     MAX(CASE WHEN RN_ASC=1 THEN [DataOra] END) AS DataOra, 
     MAX(CASE WHEN RN_ASC=1 THEN [Apertura] END) AS [Apertura], 
     MAX(Massimo) Massimo, 
     MIN(Minimo) Minimo, 
     MAX(CASE WHEN RN_DESC=1 THEN [Chiusura] END) AS [Chiusura], 
     SUM(Volume) Volume 
     /*MAX(CASE WHEN RN_DESC=1 THEN [DataOra] END) AS ChiusuraDataOra*/ 
FROM cte 
GROUP BY Simbolo,StartRange 
ORDER BY DataOra 

我想第二列DataOra(日期时间)分割成两个diferent列,一个用于日期(如果不可能性在DD/MM/yyyy格式)和第二对只有时间。 任何帮助非常感谢,谢谢。 Alberto

+0

您使用的是哪个**版本**(2005,2008,2008 R2)? – 2011-06-06 20:59:34

+0

Microsoft SQL Server Management Studio Express(SQL Server 2005) – 2011-06-06 21:01:50

回答

2

获取这些值的最简单方法是使用CONVERT。转换日期时,SQL Server有一些内置的日期格式。

CONVERT(VARCHAR, MAX(CASE WHEN RN_ASC=1 THEN [DataOra] END), 103) AS DataOraDate, 
CONVERT(VARCHAR, MAX(CASE WHEN RN_ASC=1 THEN [DataOra] END), 114) AS DataOraTime, 

这两个代码(103和114)对应于您想要的格式。请参阅http://msdn.microsoft.com/en-us/library/ms187928.aspx了解有关这些以及可以转换为的其他格式的更多详细信息。

+0

@dpmattingly我以为像你一样,但我认为它不会工作,因为选择不会做整个日期时间的最大值,它会做最大只是在一列中比较没有时间的日期,在另一个日期中只与时间比较并且不比较日期。 – 2011-06-06 21:10:00

+1

你是对的,你需要将CONVERT带到MAX以外才能使其工作。我已经调整了它以减少混淆,但我认为它与您的答案相同。 – dpmattingly 2011-06-06 21:17:37

+0

谢谢,它的工作原理,我有两个日期和时间分割列:我认为日期必须有比103更好的东西。我设置了ORDER BY DataOraDate,并且我有第1天,然后从1到12的月份,第2天,从1到12的月份等等。我应该有1到30(31)与第1个月的一天,等等。感谢 – 2011-06-06 21:26:00

2

看来你只需要改变选择。 而是这个

MAX(CASE WHEN RN_ASC=1 THEN [DataOra] END) AS DataOra, 

使用此的:

CONVERT(VARCHAR(8),MAX(CASE WHEN RN_ASC=1 THEN [DataOra] END),108) AS HourMinuteSecond, 
CONVERT(VARCHAR(8),MAX(CASE WHEN RN_ASC=1 THEN [DataOra] END),101) AS DateOnly, 

希望它能帮助。