如何更改数据集单元格格式

时间:2009-05-12 14:30:59

标签: sql sql-server sql-server-2005

如果我使用此查询创建一个表(看看Table1),但VisitingGap列格式不正确。 我用cast方法给出格式。但是没有正常工作。我需要

表2


declare @date1 nvarchar(100) , @date2 nvarchar(100) , @countgap int,@count int 
set @date1='2009-05-12'
set @date2 = '2009-05-13'
set @countgap = 30
set @count=48

CREATE TABLE #Temp (VisitingCount int, [Time] int, [Date] datetime )
DECLARE @DateNow DATETIME,@i int,@Time int, @Date datetime
set @DateNow='00:00'  
set @i=1;  
while(@i<@count)  
    begin  
        set @DateNow = DATEADD(minute, @countgap, @DateNow)
        set @Time = (datepart(hour,@DateNow)*60+datepart(minute,@DateNow))/@countgap 
        set @Date = CONVERT(VARCHAR(5),@DateNow, 108)
        insert into #Temp(VisitingCount,[Time],[Date]) values(0,@Time,@Date )
        set @i=@i+1
    end

select 
Sum(VisitingCount) as VisitingCount, [Time], 
Cast([Time]*@countgap/60 as nvarchar(50)) +':'+Cast( [Time]*@countgap%60 as nvarchar(50))
from (
  select 0 as VisitingCount, [Time] from #Temp
  Union All
    select count(page) as VisitingCount, 
    (datepart(hour,Date)*60+datepart(minute,Date))/@countgap as [Time] 
    from scr_SecuristLog
    where Date between @date1 and @date2
    GROUP BY (datepart(hour,Date)*60+datepart(minute,Date))/@countgap
  ) X
group by [Time]
order by  2 asc



表1:

<小时/>


.
.
.
VCount Time VisitingGap
0 1 0:30
0 2 1:0
0 3 1:30
0 4 2:0
0 5 2:30
0 6 3:0
0 7 3:30
0 8 4:0
0 9 4:30
0 10 5:0
.
.
.



表2:我需要在表格下面!!!!

<小时/>


.
.
.
VCount Time VisitingGap
0 1 00:30
0 2 01:00
0 3 01:30
0 4 02:00
0 5 02:30
0 6 03:00
0 7 03:30
0 8 04:00
0 9 04:30
0 10 05:00
.
.
.

请看!我认为问题是演员方法

Cast([Time] * @ countgap / 60 as nvarchar(50))+':'+ Cast([Time] * @ countgap%60 as nvarchar .........

4 个答案:

答案 0 :(得分:1)

不是将数字转换为字符串,而是尝试将日期和日期转换为字符串:

CONVERT(CHAR(5), DATEADD(mi, [Time], '1900-01-01'), 108)

答案 1 :(得分:0)

你有一个答案在while循环中盯着你:

CONVERT(VARCHAR(5),@DateNow, 108)

将@DateNow替换为[Date],你就可以了。

答案 2 :(得分:0)

真是一团糟。使用辅助数字表(避免循环)并以这种方式处理您的插槽分组。另请注意,您之间的使用可能会有问题,这就是为什么我总是使用&gt; =和&lt;构造

/*
-- DROP Numbers table if it exists
IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Numbers]') AND type in (N'U'))
DROP TABLE [dbo].[Numbers]
GO
-- Now re-create it and fill it with sequential numbers starting at 1
SELECT TOP 10000 IDENTITY(INT,1,1) AS Num
INTO dbo.Numbers
FROM master.INFORMATION_SCHEMA.COLUMNS i1
CROSS JOIN master.INFORMATION_SCHEMA.COLUMNS i2;
GO
-- Add a primary key/clustered index to the numbers table
ALTER TABLE dbo.Numbers
ADD CONSTRAINT PK_Numbers PRIMARY KEY CLUSTERED (Num);
GO
*/

CREATE TABLE #Log (
     page varchar(255) NOT NULL
    ,date datetime NOT NULL
    )

INSERT  INTO #Log
VALUES  (
         'page1'
        ,'2009-05-12 08:30'
        )
INSERT  INTO #Log
VALUES  (
         'page1'
        ,'2009-05-12 08:35'
        )
INSERT  INTO #Log
VALUES  (
         'page2'
        ,'2009-05-12 07:30'
        )
INSERT  INTO #Log
VALUES  (
         'page2'
        ,'2009-05-12 09:35'
        )

DECLARE @date1 datetime
   ,@date2 datetime
   ,@countgap int
   ,@count int 
SET @date1 = '2009-05-12'
SET @date2 = '2009-05-13'
SET @countgap = 30
SET @count = (24 * 60) / @countgap

;
WITH    LogX
          AS (
              SELECT    *
                       ,DATEADD(DAY, -DATEDIFF(DAY, 0, date), date) AS time
              FROM      #Log
              WHERE date >= @date1 AND date < DATEADD(DAY, 1, @date2)
             ),
        Slots
          AS (
              SELECT    Num
                       ,DATEADD(MINUTE, (Num - 1) * @countgap, 0) AS SlotStart
                       ,DATEADD(MINUTE, Num * @countgap, 0) AS SlotEnd
              FROM      Numbers
              WHERE     Num <= @count
             )
    SELECT  Num, CONVERT(varchar(5), SlotEnd, 108) AS [Time], COUNT(page) AS VistingCount
    FROM    Slots
    LEFT JOIN LogX
            ON LogX.TIME >= Slots.SlotStart
               AND LogX.TIME < Slots.SlotEnd
    GROUP BY Num, SlotEnd

DROP TABLE #Log

答案 3 :(得分:-1)

当你进行数学计算时,你会失去前导零,这会在你形成字符串时将它们添加回来

修改

original code-->           Cast([Time]*@countgap/60 as nvarchar(50))    +':'+           Cast( [Time]*@countgap%60 as nvarchar(50))
changed code--->RIGHT('00'+Cast([Time]*@countgap/60 as varchar(2)  ),2) +':'+RIGHT('00'+Cast( [Time]*@countgap%60 as varchar(2)  ),2)