我有一个查询,可以将数据从1分钟聚合(压缩)到任何其他时间范围,并且运行正常。
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(DateTime)拆分为两个不同的列,一个用于Date(如果可能是dd / mm / yyyy格式),第二个列用于Time。 任何帮助非常感谢,谢谢。 阿尔贝托
答案 0 :(得分:2)
获取这些值的最简单方法是使用CONVERT
。转换Date时,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。
答案 1 :(得分: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,
希望它有所帮助。