Как изменить nvarchar на формат datetime? - PullRequest
0 голосов
/ 13 мая 2009

Мой код генерирует некоторый набор данных за 10-минутный журнал или за 30-минутный журнал, но формат даты и времени равен '1900-01-01 14:20:00'. Мне нужно '2009-05-13 14:20:00', поэтому я хочу изменить его.

См. Таблицу 1 и Таблицу 2 ниже.

declare @date1 nvarchar(100) , @date2 nvarchar(100) , @countgap int,@count int 
set @date1='2009-05-12'
set @date2 = '2009-05-13'
set @countgap = 10 --per ten minutes


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;  
insert into #Temp(VisitingCount,[Time],[Date]) values(0,0,@DateNow )
while(@i<(24*60)/@countgap)  
    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( RIGHT('00'+Cast([Time]*@countgap/60 as varchar(2)  ),2) +':'+RIGHT('00'+Cast( [Time]*@countgap%60 as varchar(2)  ),2)  as Smalldatetime)as VisitingGap
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 

Table1

VCount  Time    VisitingGap
 6      86      1900-01-01 14:20:00
17      87      1900-01-01 14:30:00
 9      88      1900-01-01 14:40:00
20      89      1900-01-01 14:50:00
19      90      1900-01-01 15:00:00
 0      91      1900-01-01 15:10:00
 7      92      1900-01-01 15:20:00
 4      93      1900-01-01 15:30:00
 8      94      1900-01-01 15:40:00
 9      95      1900-01-01 15:50:00
 0      96      1900-01-01 16:00:00
20      97      1900-01-01 16:10:00
24      98      1900-01-01 16:20:00

Table2

VCount  Time    VisitingGap
...
 6      86      2009-05-13 14:20:00
17      87      2009-05-13 14:30:00
 9      88      2009-05-13 14:40:00
20      89      2009-05-13 14:50:00
19      90      2009-05-13 15:00:00
...

Я думаю, мне нужно изменить это:

Cast( RIGHT('00'+Cast([Time]*@countgap/60 as varchar(2)  ),2) +':'+RIGHT('00'+Cast( [Time]*@countgap%60 as varchar(2)  ),2)  as Smalldatetime)as VisitingGap

Ответы [ 2 ]

1 голос
/ 13 мая 2009

Вы используете значение SmallDateTime. Это имеет минимальное значение 01/01 / 1900.

Я вижу, что вы установили свой DateNow на '00: 00'. Это установит минимальное значение даты плюс время '00: 00 '.

Вам необходимо установить текущую дату или, по крайней мере, любую дату начала, на которой основан ваш таймер.

1 голос
/ 13 мая 2009

Почему бы вам не объявить переменные даты как datetime?

  declare @date1 datetime
  declare @date2 datetime

  set dateformat ymd

  set @date1 = '2009-05-12'
  set @date1 = '2009-05-13'

  ...

Таким образом, вам не нужно делать какие-либо преобразования из nvarchar в datetime.

Или, если данные поступают извне, используя set dateformat, вы можете преобразовать их в первую очередь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...