如果我使用此查询创建一个表(看看Table1),但VisitingGap列格式不正确。 我用cast方法给出格式。但是没有正常工作。我需要
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
<小时/>
.
.
.
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
.
.
.
<小时/>
.
.
.
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 .........
答案 0 :(得分:1)
不是将数字转换为字符串,而是尝试将日期和日期转换为字符串:
CONVERT(CHAR(5), DATEADD(mi, [Time], '1900-01-01'), 108)
答案 1 :(得分:0)
你有一个答案在while循环中盯着你:
CONVERT(VARCHAR(5),@DateNow, 108)
将@DateNow替换为[Date],你就可以了。
答案 2 :(得分:0)
/*
-- 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)