Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Работа с временем  [new]
Mr. Abdu Jan
Member

Откуда:
Сообщений: 55
Привет всем...
У меня тут такая задача..
Есть таблица times, где в нем находится 2 поле - Stime и Etime.

Stime			Etime
11.03.2012 0:00:00	11.03.2012 0:01:18
18.03.2012 0:03:18	18.03.2012 0:05:53
18.03.2012 0:06:01	18.03.2012 0:08:01
19.03.2012 1:01:00	19.03.2012 1:10:00


Результат должен быть таким:

00:00		1
00:01		1
00:02
00:03		1
00:04		1
00:05		1
...
23:58
23:59


Можно сделать какой нибудь запрос , курсор или что нибудь, чтоб в диапазоне Stime и Etime вставились единицы? (секунды из таблицы не используются)
18 май 12, 16:50    [12578921]     Ответить | Цитировать Сообщить модератору
 Re: Работа с временем  [new]
RubinDm
Member

Откуда:
Сообщений: 461
Mr. Abdu Jan, ничего что 00:04 может засветиться в разных датах? что в таком случае делать?
18 май 12, 17:06    [12579042]     Ответить | Цитировать Сообщить модератору
 Re: Работа с временем  [new]
Владимир Затуливетер
Member

Откуда:
Сообщений: 427
Mr. Abdu Jan,

Как то так:

if object_id('tempdb..#Times') is not null 
    begin
        drop table #Times
    end
go  
    
create table #Times
    (
      Stime datetime2(0)
    , Etime datetime2(0)
    )

insert  into #times
        ( stime, etime )
values  ( '20120311 0:00:00', '20120311 0:01:18' ),
        ( '20120311 0:00:00', '20120311 0:08:18' ), -- на всяк случай добавил для теста пересечения дат
        ( '20120318 0:03:18', '20120318 0:05:53' ),
        ( '20120318 0:06:01', '20120318 0:08:01' ),
        ( '20120319 1:01:00', '20120319 1:10:00' );

with    cte ( tm )
          as ( select   convert(time(0), '00:00:00')
               union all
               select   dateadd(minute, 1, tm)
               from     cte
               where    tm < '23:59:00'
             )
    select  tm
          , ex
    from    cte
            outer apply ( select top ( 1 )
                                    1 as ex
                          from      #times
                          where     tm between convert(time(0), stime) and convert(time(0), etime)
                        ) t
option  ( maxrecursion 0 )  
		
18 май 12, 17:11    [12579081]     Ответить | Цитировать Сообщить модератору
 Re: Работа с временем  [new]
Мистер Хенки
Member

Откуда: канализация
Сообщений: 6615
Владимир Затуливетер,
Поправлю немного
if object_id('tempdb..#Times') is not null 
    begin
        drop table #Times
    end
go  
    
create table #Times
    (
      Stime datetime2(0)
    , Etime datetime2(0)
    )

insert  into #times
        ( stime, etime )
values  ( '20120311 0:00:00', '20120311 0:01:18' ),
        --( '20120311 0:00:00', '20120311 0:08:18' ), -- на всяк случай добавил для теста пересечения дат
        ( '20120318 0:03:18', '20120318 0:05:53' ),
        ( '20120318 0:06:01', '20120318 0:08:01' ),
        ( '20120319 1:01:00', '20120319 1:10:00' );

with    cte ( tm )
          as ( select   convert(time(0), '00:00:00')
               union all
               select   dateadd(minute, 1, tm)
               from     cte
               where    tm < '23:59:00'
             )
    select  tm
          , ex
    from    cte
            outer apply ( select top ( 1 )
                                    1 as ex
                          from      #times
                          where     tm between convert(time(0),convert(char(6),convert(time(0), stime))+'00') and convert(time(0),convert(char(6),convert(time(0), etime))+'00')
                        ) t
option  ( maxrecursion 0 )  

В задании указывалось секунды не учитывать
18 май 12, 17:25    [12579159]     Ответить | Цитировать Сообщить модератору
 Re: Работа с временем  [new]
Mr. Abdu Jan
Member

Откуда:
Сообщений: 55
несколько таких ошибок выводит недопустимая длина или неправильные характеристики точности 0

Мистер Хенки
Владимир Затуливетер,
Поправлю немного
if object_id('tempdb..#Times') is not null 
    begin
        drop table #Times
    end
go  
    
create table #Times
    (
      Stime datetime2(0)
    , Etime datetime2(0)
    )

insert  into #times
        ( stime, etime )
values  ( '20120311 0:00:00', '20120311 0:01:18' ),
        --( '20120311 0:00:00', '20120311 0:08:18' ), -- на всяк случай добавил для теста пересечения дат
        ( '20120318 0:03:18', '20120318 0:05:53' ),
        ( '20120318 0:06:01', '20120318 0:08:01' ),
        ( '20120319 1:01:00', '20120319 1:10:00' );

with    cte ( tm )
          as ( select   convert(time(0), '00:00:00')
               union all
               select   dateadd(minute, 1, tm)
               from     cte
               where    tm < '23:59:00'
             )
    select  tm
          , ex
    from    cte
            outer apply ( select top ( 1 )
                                    1 as ex
                          from      #times
                          where     tm between convert(time(0),convert(char(6),convert(time(0), stime))+'00') and convert(time(0),convert(char(6),convert(time(0), etime))+'00')
                        ) t
option  ( maxrecursion 0 )  

В задании указывалось секунды не учитывать
18 май 12, 17:45    [12579316]     Ответить | Цитировать Сообщить модератору
 Re: Работа с временем  [new]
Mr. Abdu Jan
Member

Откуда:
Сообщений: 55
Mr. Abdu Jan,

по моему данный код сделан на SQL SERVER > 2005?
Потому что у меня 2005..
18 май 12, 17:48    [12579338]     Ответить | Цитировать Сообщить модератору
 Re: Работа с временем  [new]
Владимир Затуливетер
Member

Откуда:
Сообщений: 427
Mr. Abdu Jan,

да для 2008 сделано...
для 2005 подумать нужно.
18 май 12, 17:57    [12579402]     Ответить | Цитировать Сообщить модератору
 Re: Работа с временем  [new]
Мистер Хенки
Member

Откуда: канализация
Сообщений: 6615
if object_id('tempdb..#Times') is not null 
    begin
        drop table #Times
    end
go  
    
create table #Times
    (
      Stime datetime2(0)
    , Etime datetime2(0)
    )

insert  into #times
        ( stime, etime )
values  ( '20120311 0:00:00', '20120311 0:01:18' ),
        --( '20120311 0:00:00', '20120311 0:08:18' ), -- на всяк случай добавил для теста пересечения дат
        ( '20120318 0:03:18', '20120318 0:05:53' ),
        ( '20120318 0:06:01', '20120318 0:08:01' ),
        ( '20120319 1:01:00', '20120319 1:10:00' );

with    cte ( tm )
          as ( select   convert(datetime, 0)
               union all
               select   dateadd(minute, 1, tm)
               from     cte
               where    tm < convert(datetime,'1900-01-01 23:59:00')
             )
    select  tm
          , ex
    from    cte
			
            outer apply ( select top ( 1 )
                                    1 as ex
                          from      #times t
									cross apply(select val=dateadd(d,-DATEDIFF(D,0,t.stime),t.stime) )sz
									cross apply(select val=dateadd(d,-DATEDIFF(D,0,t.etime),t.etime) )ez
									cross apply(select val1=datediff(hh,0,sz.val), val2=DATEADD(HH,-datediff(hh,0,sz.val),sz.val) )sz2
									cross apply(select val1=datediff(hh,0,ez.val), val2=DATEADD(HH,-datediff(hh,0,ez.val),ez.val) )ez2
									cross apply(select val1=datediff(MI,0,sz2.val2), val2=DATEADD(mi,-datediff(mi,0,sz2.val1),sz2.val1) )sz3
									cross apply(select val1=datediff(MI,0,ez2.val2), val2=DATEADD(mi,-datediff(mi,0,ez2.val1),ez2.val1) )ez3
									cross apply(select val = dateadd(mi,sz3.val1, DATEADD(HH,sz2.val1,0) ))sz4
									cross apply(select val = dateadd(mi,ez3.val1, DATEADD(HH,ez2.val1,0) ))ez4
                          where     tm between sz4.val  and ez4.val
                        ) t
option  ( maxrecursion 0 )  

попробуй так
18 май 12, 18:28    [12579609]     Ответить | Цитировать Сообщить модератору
 Re: Работа с временем  [new]
Владимир Затуливетер
Member

Откуда:
Сообщений: 427
Вот так тоже ничаго :)
if object_id('tempdb..#Times') is not null 
    begin
        drop table #Times
    end
go  
    
create table #Times
    (
      Stime datetime2(0)
    , Etime datetime2(0)
    )

insert  into #times
        ( stime, etime )
values  ( '20120311 0:00:00', '20120311 0:01:18' ),
        --( '20120311 0:00:00', '20120311 0:08:18' ), -- на всяк случай добавил для теста пересечения дат
        ( '20120318 0:03:18', '20120318 0:05:53' ),
        ( '20120318 0:06:01', '20120318 0:08:01' ),
        ( '20120319 1:01:00', '20120319 1:10:00' );

with    cte ( tm )
          as ( select   0
               union all
               select   tm + 1
               from     cte
               where    tm < ( 24 * 60 ) - 1
             )
    select  dateadd(minute, tm, '19000101') as time
          , ex
    from    cte
            outer apply ( select top ( 1 )
                                    1 as ex
                          from      #times t
                          where     tm between datepart(hour, t.stime) * 60 + datepart(minute, t.stime)
                                       and     datepart(hour, t.etime) * 60 + datepart(minute, t.etime)
                        ) t
option  ( maxrecursion 0 )
18 май 12, 19:31    [12579858]     Ответить | Цитировать Сообщить модератору
 Re: Работа с временем  [new]
Mr. Abdu Jan
Member

Откуда:
Сообщений: 55
Спасибо всем огромное..
А можно как нибудь убрать год, месяц, день, секунды, милисекунды из результата?

1900-01-01 00:00:00.000
1900-01-01 00:01:00.000
1900-01-01 00:02:00.000
18 май 12, 21:19    [12580324]     Ответить | Цитировать Сообщить модератору
 Re: Работа с временем  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11289
Mr. Abdu Jan, CONVERT
19 май 12, 01:22    [12581125]     Ответить | Цитировать Сообщить модератору
 Re: Работа с временем  [new]
Владимир Затуливетер
Member

Откуда:
Сообщений: 427
if object_id('tempdb..#Times') is not null 
    begin
        drop table #Times
    end
go  
    
create table #Times
    (
      Stime datetime2(0)
    , Etime datetime2(0)
    )

insert  into #times
        ( stime, etime )
values  ( '20120311 0:00:00', '20120311 0:01:18' ),
        --( '20120311 0:05:00', '20120311 0:12:18' ), -- на всяк случай добавил для теста пересечения дат
        ( '20120318 0:03:18', '20120318 0:05:53' ),
        ( '20120318 0:06:01', '20120318 0:08:01' ),
        ( '20120319 1:01:00', '20120319 1:10:00' );

with    cte ( tm )
          as ( select   0
               union all
               select   tm + 1
               from     cte
               where    tm < ( 24 * 60 ) - 1
             )
    select  left(convert(varchar(16), dateadd(minute, tm, '19000101'), 108), 5) as time
          , ex
    from    cte
            outer apply ( select top ( 1 )
                                    1 as ex
                          from      #times t
                          where     tm between datepart(hour, t.stime) * 60 + datepart(minute, t.stime)
                                       and     datepart(hour, t.etime) * 60 + datepart(minute, t.etime)
                        ) t
option  ( maxrecursion 0 )
19 май 12, 15:58    [12581888]     Ответить | Цитировать Сообщить модератору
 Re: Работа с временем  [new]
Mr. Abdu Jan
Member

Откуда:
Сообщений: 55
Спасибо всем огромное
19 май 12, 23:39    [12583300]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить