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

Откуда:
Сообщений: 9
Доброе время суток!
Как получить из таково набора данных

<tr><td>statis<td>start_data<td>end_data<td>id_non
<tr><td>12<td>2020-03-14 09:00:00.000 <td> 2020-03-15 17:31:54.000 <td>1
<tr><td>12<td>2020-03-15 17:31:54.000 <td> 2020-03-15 20:31:54.000 <td>2
<tr><td>12<td>2020-03-15 20:31:54.000 <td> 2020-03-15 20:35:54.000 <td>3

получить вот такой набор данных с интервалом примерно в 1 час, если интервал между датами меньше 1 часа то его оставляем не тронутым

<tr><td>statis<td>start_data<td>end_data<td>id_non
<tr><td>12<td>2020-03-14 09:00:00.000 <td> 2020-03-14 10:00:00.000 <td>1
<tr><td>12<td>2020-03-14 10:00:00.000 <td> 2020-03-14 11:00:00.000 <td>1
<tr><td>12<td>2020-03-14 11:00:00.000 <td> 2020-03-14 12:00:00.000 <td>1
..................................
<tr><td>12<td>2020-03-15 17:00:00.000 <td> 2020-03-15 17:31:54.000 <td>1
<tr><td>12<td>2020-03-15 17:31:54.000 <td> 2020-03-15 18:31:54.000 <td>2
<tr><td>12<td>2020-03-15 18:31:54.000 <td> 2020-03-15 19:31:54.000 <td>2
<tr><td>12<td>2020-03-15 19:31:54.000 <td> 2020-03-15 20:31:54.000 <td>2
<tr><td>12<td>2020-03-15 20:31:54.000 <td> 2020-03-15 20:35:54.000 <td>3
22 мар 20, 08:38    [22103851]     Ответить | Цитировать Сообщить модератору
 Re: Получение интервала между двумя датами SQL  [new]
PsyMisha
Member

Откуда: другая столица
Сообщений: 742
Иван_Перекрест,

Слушште, - ну совсем уже обленились - ну хоть от HTML-тэгов то очистите вначале, прежде чем на форум по MSSQL приходить?
Чую, - через n-лет будут вопросы от молодёжи - в стиле "ээ, - мне препод че-то там сказал, я ваще полу-понял, - сделайте чё-как за меня, а?"

Сообщение было отредактировано: 22 мар 20, 10:45
22 мар 20, 10:45    [22103872]     Ответить | Цитировать Сообщить модератору
 Re: Получение интервала между двумя датами SQL  [new]
Иван_Перекрест
Member

Откуда:
Сообщений: 9
PsyMisha,

Не знаю просто как вставить таблицу, думал получится с тегами html таблица. Отредактировать не могу чтобы убрать теги.
Мне нужен sql зарос для получение из одного набора данных в нужный набор данных, с разделением интервала времени.
22 мар 20, 11:02    [22103876]     Ответить | Цитировать Сообщить модератору
 Re: Получение интервала между двумя датами SQL  [new]
court
Member

Откуда:
Сообщений: 1956
Иван_Перекрест
Не знаю просто как вставить таблицу, думал получится с тегами html таблица.
Рекомендации по оформлению сообщений в форуме
22 мар 20, 11:07    [22103877]     Ответить | Цитировать Сообщить модератору
 Re: Получение интервала между двумя датами SQL  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 30701
Иван_Перекрест
Как получить из таково набора данных

получить вот такой набор данных с интервалом примерно в 1 час, если интервал между датами меньше 1 часа то его оставляем не тронутым
Сделайте таблицу - календарь, кросс-джойните её с набором часов, и потом это джойните с вашей таблицей.

Если нужно объяснить подробнее, сделайте тестовый скрипт с временной таблицей, заполненной данными.
22 мар 20, 13:23    [22103921]     Ответить | Цитировать Сообщить модератору
 Re: Получение интервала между двумя датами SQL  [new]
Иван_Перекрест
Member

Откуда:
Сообщений: 9
statis | start_data | end_data | id_non
12 | 2020-03-14 09:00:00.000 | 2020-03-15 17:31:54.000 | 1
12 | 2020-03-15 17:31:54.000 | 2020-03-15 20:31:54.000 | 2
12 | 2020-03-15 20:31:54.000 | 2020-03-15 20:35:54.000 | 3

получить вот такой набор данных с интервалом примерно в 1 час, если интервал между датами меньше 1 часа то его оставляем не тронутым

statis | start_data | end_data | id_non
12 | 2020-03-14 09:00:00.000 | 2020-03-14 10:00:00.000 | 1
12 | 2020-03-14 10:00:00.000 | 2020-03-14 11:00:00.000 | 1
12 | 2020-03-14 11:00:00.000 | 2020-03-14 12:00:00.000 | 1
..................................
12 | 2020-03-15 17:00:00.000 | 2020-03-15 17:31:54.000 | 1
12 | 2020-03-15 17:31:54.000 | 2020-03-15 18:31:54.000 | 2
12 | 2020-03-15 18:31:54.000 | 2020-03-15 19:31:54.000 | 2
12 | 2020-03-15 19:31:54.000 | 2020-03-15 20:31:54.000 | 2
12 | 2020-03-15 20:31:54.000 | 2020-03-15 20:35:54.000 | 3
22 мар 20, 15:28    [22103968]     Ответить | Цитировать Сообщить модератору
 Re: Получение интервала между двумя датами SQL  [new]
court
Member

Откуда:
Сообщений: 1956
Картинка с другого сайта.
Иван_Перекрест
statis start_data end_data id_non
12 2020-03-14 09:00:00.000 2020-03-15 17:31:54.000 1
12 2020-03-15 17:31:54.000 2020-03-15 20:31:54.000 2
12 2020-03-15 20:31:54.000 2020-03-15 20:35:54.000 3


получить вот такой набор данных с интервалом примерно в 1 час, если интервал между датами меньше 1 часа то его оставляем не тронутым

statis start_data end_data id_non
12 2020-03-14 09:00:00.000 2020-03-14 10:00:00.000 1
12 2020-03-14 10:00:00.000 2020-03-14 11:00:00.000 1
12 2020-03-14 11:00:00.000 2020-03-14 12:00:00.000 1
..................................
12 2020-03-15 17:00:00.000 2020-03-15 17:31:54.000 1
12 2020-03-15 17:31:54.000 2020-03-15 18:31:54.000 2
12 2020-03-15 18:31:54.000 2020-03-15 19:31:54.000 2
12 2020-03-15 19:31:54.000 2020-03-15 20:31:54.000 2
12 2020-03-15 20:31:54.000 2020-03-15 20:35:54.000 3
22 мар 20, 16:05    [22103979]     Ответить | Цитировать Сообщить модератору
 Re: Получение интервала между двумя датами SQL  [new]
court
Member

Откуда:
Сообщений: 1956
set dateformat ymd

declare @t table (statis int,	start_data datetime,	end_data datetime,	id_non int)
insert into @t values
(12,	'2020-03-14 09:00:00.000',	'2020-03-15 17:31:54.000',	1),
(12,	'2020-03-15 17:31:54.000',	'2020-03-15 20:31:54.000',	2),
(12,	'2020-03-15 20:31:54.000',	'2020-03-15 20:35:54.000',	3)

select * from @t

--
select
	statis
	,dateadd(hour, a.n, start_data) as start_data
	,case when dateadd(hour, a.n+1, start_data) > end_data then end_data else dateadd(hour, a.n+1, start_data) end as end_data
	,id_non
from @t t
cross apply (select n from [dbo].[GetNums](0, datediff(hour, t.start_data, t.end_data))) a 
/* ? если  start_data = end_data то должна строка попасть в выборку ? */
where dateadd(hour, a.n, start_data) < case when dateadd(hour, a.n+1, start_data) > end_data then end_data else dateadd(hour, a.n+1, start_data) end


statisstart_dataend_dataid_non
122020-03-14 09:00:00.0002020-03-14 10:00:00.0001
122020-03-14 10:00:00.0002020-03-14 11:00:00.0001
122020-03-14 11:00:00.0002020-03-14 12:00:00.0001
122020-03-14 12:00:00.0002020-03-14 13:00:00.0001
122020-03-14 13:00:00.0002020-03-14 14:00:00.0001
122020-03-14 14:00:00.0002020-03-14 15:00:00.0001
122020-03-14 15:00:00.0002020-03-14 16:00:00.0001
122020-03-14 16:00:00.0002020-03-14 17:00:00.0001
122020-03-14 17:00:00.0002020-03-14 18:00:00.0001
122020-03-14 18:00:00.0002020-03-14 19:00:00.0001
122020-03-14 19:00:00.0002020-03-14 20:00:00.0001
122020-03-14 20:00:00.0002020-03-14 21:00:00.0001
122020-03-14 21:00:00.0002020-03-14 22:00:00.0001
122020-03-14 22:00:00.0002020-03-14 23:00:00.0001
122020-03-14 23:00:00.0002020-03-15 00:00:00.0001
122020-03-15 00:00:00.0002020-03-15 01:00:00.0001
122020-03-15 01:00:00.0002020-03-15 02:00:00.0001
122020-03-15 02:00:00.0002020-03-15 03:00:00.0001
122020-03-15 03:00:00.0002020-03-15 04:00:00.0001
122020-03-15 04:00:00.0002020-03-15 05:00:00.0001
122020-03-15 05:00:00.0002020-03-15 06:00:00.0001
122020-03-15 06:00:00.0002020-03-15 07:00:00.0001
122020-03-15 07:00:00.0002020-03-15 08:00:00.0001
122020-03-15 08:00:00.0002020-03-15 09:00:00.0001
122020-03-15 09:00:00.0002020-03-15 10:00:00.0001
122020-03-15 10:00:00.0002020-03-15 11:00:00.0001
122020-03-15 11:00:00.0002020-03-15 12:00:00.0001
122020-03-15 12:00:00.0002020-03-15 13:00:00.0001
122020-03-15 13:00:00.0002020-03-15 14:00:00.0001
122020-03-15 14:00:00.0002020-03-15 15:00:00.0001
122020-03-15 15:00:00.0002020-03-15 16:00:00.0001
122020-03-15 16:00:00.0002020-03-15 17:00:00.0001
122020-03-15 17:00:00.0002020-03-15 17:31:54.0001
122020-03-15 17:31:54.0002020-03-15 18:31:54.0002
122020-03-15 18:31:54.0002020-03-15 19:31:54.0002
122020-03-15 19:31:54.0002020-03-15 20:31:54.0002
122020-03-15 20:31:54.0002020-03-15 20:35:54.0003
22 мар 20, 16:36    [22103991]     Ответить | Цитировать Сообщить модератору
 Re: Получение интервала между двумя датами SQL  [new]
Иван_Перекрест
Member

Откуда:
Сообщений: 9
court,
[dbo].[GetNums] что хранится вот в этой таблице?

/* ? если start_data = end_data то должна строка попасть в выборку ? */
они не могут быть одинаковые, все равно будут от лечатся на мили секунды
22 мар 20, 17:25    [22104017]     Ответить | Цитировать Сообщить модератору
 Re: Получение интервала между двумя датами SQL  [new]
court
Member

Откуда:
Сообщений: 1956
Иван_Перекрест
[dbo].[GetNums] что хранится вот в этой таблице?
это не таблица
Это табл.функция.
Заряди GetNums в поиск по форуму

Иван_Перекрест
они не могут быть одинаковые, все равно будут от лечатся на мили секунды

я не про исх.данные, а про результат
Без условия where запрос вернет ещё одну запись

+
statisstart_dataend_dataid_non
122020-03-14 09:00:00.0002020-03-14 10:00:00.0001
122020-03-14 10:00:00.0002020-03-14 11:00:00.0001
122020-03-14 11:00:00.0002020-03-14 12:00:00.0001
122020-03-14 12:00:00.0002020-03-14 13:00:00.0001
122020-03-14 13:00:00.0002020-03-14 14:00:00.0001
122020-03-14 14:00:00.0002020-03-14 15:00:00.0001
122020-03-14 15:00:00.0002020-03-14 16:00:00.0001
122020-03-14 16:00:00.0002020-03-14 17:00:00.0001
122020-03-14 17:00:00.0002020-03-14 18:00:00.0001
122020-03-14 18:00:00.0002020-03-14 19:00:00.0001
122020-03-14 19:00:00.0002020-03-14 20:00:00.0001
122020-03-14 20:00:00.0002020-03-14 21:00:00.0001
122020-03-14 21:00:00.0002020-03-14 22:00:00.0001
122020-03-14 22:00:00.0002020-03-14 23:00:00.0001
122020-03-14 23:00:00.0002020-03-15 00:00:00.0001
122020-03-15 00:00:00.0002020-03-15 01:00:00.0001
122020-03-15 01:00:00.0002020-03-15 02:00:00.0001
122020-03-15 02:00:00.0002020-03-15 03:00:00.0001
122020-03-15 03:00:00.0002020-03-15 04:00:00.0001
122020-03-15 04:00:00.0002020-03-15 05:00:00.0001
122020-03-15 05:00:00.0002020-03-15 06:00:00.0001
122020-03-15 06:00:00.0002020-03-15 07:00:00.0001
122020-03-15 07:00:00.0002020-03-15 08:00:00.0001
122020-03-15 08:00:00.0002020-03-15 09:00:00.0001
122020-03-15 09:00:00.0002020-03-15 10:00:00.0001
122020-03-15 10:00:00.0002020-03-15 11:00:00.0001
122020-03-15 11:00:00.0002020-03-15 12:00:00.0001
122020-03-15 12:00:00.0002020-03-15 13:00:00.0001
122020-03-15 13:00:00.0002020-03-15 14:00:00.0001
122020-03-15 14:00:00.0002020-03-15 15:00:00.0001
122020-03-15 15:00:00.0002020-03-15 16:00:00.0001
122020-03-15 16:00:00.0002020-03-15 17:00:00.0001
122020-03-15 17:00:00.0002020-03-15 17:31:54.0001
122020-03-15 17:31:54.0002020-03-15 18:31:54.0002
122020-03-15 18:31:54.0002020-03-15 19:31:54.0002
122020-03-15 19:31:54.0002020-03-15 20:31:54.0002
122020-03-15 20:31:54.0002020-03-15 20:31:54.0002
122020-03-15 20:31:54.0002020-03-15 20:35:54.0003
22 мар 20, 17:33    [22104022]     Ответить | Цитировать Сообщить модератору
 Re: Получение интервала между двумя датами SQL  [new]
Иван_Перекрест
Member

Откуда:
Сообщений: 9
court,
повторную запись нужно убирать.
22 мар 20, 17:46    [22104026]     Ответить | Цитировать Сообщить модератору
 Re: Получение интервала между двумя датами SQL  [new]
Иван_Перекрест
Member

Откуда:
Сообщений: 9
в таблице еще существует запись NULL и запрос выдает ошибку
Msg 1014, Level 15, State 1, Line 1
A TOP or FETCH clause contains an invalid value.
NULL нужно подменивать на GETDATE
declare @t table (statis int,	start_data datetime,	end_data datetime,	id_non int)
insert into @t values
(12,	'2020-03-14 09:00:00.000',	'2020-03-15 17:31:54.000',	1),
(12,	'2020-03-15 17:31:54.000',	'2020-03-15 20:31:54.000',	2),
(12,	'2020-03-15 20:31:54.000',	'NULL',	3)
23 мар 20, 08:07    [22104216]     Ответить | Цитировать Сообщить модератору
 Re: Получение интервала между двумя датами SQL  [new]
Иван_Перекрест
Member

Откуда:
Сообщений: 9
court
set dateformat ymd

declare @t table (statis int,	start_data datetime,	end_data datetime,	id_non int)
insert into @t values
(12,	'2020-03-14 09:00:00.000',	'2020-03-15 17:31:54.000',	1),
(12,	'2020-03-15 17:31:54.000',	'2020-03-15 20:31:54.000',	2),
(12,	'2020-03-15 20:31:54.000',	'2020-03-15 20:35:54.000',	3)

select * from @t

--
select
	statis
	,dateadd(hour, a.n, start_data) as start_data
	,case when dateadd(hour, a.n+1, start_data) > end_data then end_data else dateadd(hour, a.n+1, start_data) end as end_data
	,id_non
from @t t
cross apply (select n from [dbo].[GetNums](0, datediff(hour, t.start_data, t.end_data))) a 
/* ? если  start_data = end_data то должна строка попасть в выборку ? */
where dateadd(hour, a.n, start_data) < case when dateadd(hour, a.n+1, start_data) > end_data then end_data else dateadd(hour, a.n+1, start_data) end





statiststart_datatend_datatid_non
12t2020-03-14 09:00:00.000t2020-03-14 10:00:00.000t1
12t2020-03-14 10:00:00.000t2020-03-14 11:00:00.000t1
12t2020-03-14 11:00:00.000t2020-03-14 12:00:00.000t1
12t2020-03-14 12:00:00.000t2020-03-14 13:00:00.000t1
12t2020-03-14 13:00:00.000t2020-03-14 14:00:00.000t1
12t2020-03-14 14:00:00.000t2020-03-14 15:00:00.000t1
12t2020-03-14 15:00:00.000t2020-03-14 16:00:00.000t1
12t2020-03-14 16:00:00.000t2020-03-14 17:00:00.000t1
12t2020-03-14 17:00:00.000t2020-03-14 18:00:00.000t1
12t2020-03-14 18:00:00.000t2020-03-14 19:00:00.000t1
12t2020-03-14 19:00:00.000t2020-03-14 20:00:00.000t1
12t2020-03-14 20:00:00.000t2020-03-14 21:00:00.000t1
12t2020-03-14 21:00:00.000t2020-03-14 22:00:00.000t1
12t2020-03-14 22:00:00.000t2020-03-14 23:00:00.000t1
12t2020-03-14 23:00:00.000t2020-03-15 00:00:00.000t1
12t2020-03-15 00:00:00.000t2020-03-15 01:00:00.000t1
12t2020-03-15 01:00:00.000t2020-03-15 02:00:00.000t1
12t2020-03-15 02:00:00.000t2020-03-15 03:00:00.000t1
12t2020-03-15 03:00:00.000t2020-03-15 04:00:00.000t1
12t2020-03-15 04:00:00.000t2020-03-15 05:00:00.000t1
12t2020-03-15 05:00:00.000t2020-03-15 06:00:00.000t1
12t2020-03-15 06:00:00.000t2020-03-15 07:00:00.000t1
12t2020-03-15 07:00:00.000t2020-03-15 08:00:00.000t1
12t2020-03-15 08:00:00.000t2020-03-15 09:00:00.000t1
12t2020-03-15 09:00:00.000t2020-03-15 10:00:00.000t1
12t2020-03-15 10:00:00.000t2020-03-15 11:00:00.000t1
12t2020-03-15 11:00:00.000t2020-03-15 12:00:00.000t1
12t2020-03-15 12:00:00.000t2020-03-15 13:00:00.000t1
12t2020-03-15 13:00:00.000t2020-03-15 14:00:00.000t1
12t2020-03-15 14:00:00.000t2020-03-15 15:00:00.000t1
12t2020-03-15 15:00:00.000t2020-03-15 16:00:00.000t1
12t2020-03-15 16:00:00.000t2020-03-15 17:00:00.000t1
12t2020-03-15 17:00:00.000t2020-03-15 17:31:54.000t1
12t2020-03-15 17:31:54.000t2020-03-15 18:31:54.000t2
12t2020-03-15 18:31:54.000t2020-03-15 19:31:54.000t2
12t2020-03-15 19:31:54.000t2020-03-15 20:31:54.000t2
12t2020-03-15 20:31:54.000t2020-03-15 20:35:54.000t3

А как сделать в запросе проверку времени смены 12 часов

set dateformat ymd

declare @t table (statis int,	start_data datetime,	end_data datetime,	id_non int)
insert into @t values
(12,	'2020-03-14 07:00:00.000',	'2020-03-15 07:36:00.000',	1), -- тут надо разделить статус до 07:30:00 и после 07:30:00
(12,	'2020-03-15 07:36:00.000',	'2020-03-15 20:31:54.000',	2), -- так как этот статус попал в промежуток с  07:30:00 до 19:30:00 необходимо обрезать его и начать новый с 19:30:00 и продолжить его  до завершение end_data
(12,	'2020-03-15 20:31:54.000',	'2020-03-15 20:35:54.000',	3)

select * from @t

таблица должна получится

set dateformat ymd

declare @t table (statis int,	start_data datetime,	end_data datetime,	id_non int)
insert into @t values
(12,	'2020-03-14 07:00:00.000',	'2020-03-15 07:30:00.000',	1),
(12,	'2020-03-14 07:30:00.000',	'2020-03-15 07:36:00.000',	1),
(12,	'2020-03-15 07:36:00.000',	'2020-03-15 19:30:00.000',	2),
(12,	'2020-03-15 19:30:00.000',	'2020-03-15 20:31:54.000',	2), 
(12,	'2020-03-15 20:31:54.000',	'2020-03-15 20:35:54.000',	3)

select * from @t
24 мар 20, 10:36    [22104938]     Ответить | Цитировать Сообщить модератору
 Re: Получение интервала между двумя датами SQL  [new]
court
Member

Откуда:
Сообщений: 1956
Иван_Перекрест,

друган, ты знаешь что такое "вопросительный знак" ?
24 мар 20, 10:56    [22104954]     Ответить | Цитировать Сообщить модератору
 Re: Получение интервала между двумя датами SQL  [new]
court
Member

Откуда:
Сообщений: 1956
Иван_Перекрест
court
set dateformat ymd

declare @t table (statis int,	start_data datetime,	end_data datetime,	id_non int)
insert into @t values
(12,	'2020-03-14 09:00:00.000',	'2020-03-15 17:31:54.000',	1),
(12,	'2020-03-15 17:31:54.000',	'2020-03-15 20:31:54.000',	2),
(12,	'2020-03-15 20:31:54.000',	'2020-03-15 20:35:54.000',	3)

select * from @t

--
select
	statis
	,dateadd(hour, a.n, start_data) as start_data
	,case when dateadd(hour, a.n+1, start_data) > end_data then end_data else dateadd(hour, a.n+1, start_data) end as end_data
	,id_non
from @t t
cross apply (select n from [dbo].[GetNums](0, datediff(hour, t.start_data, t.end_data))) a 
/* ? если  start_data = end_data то должна строка попасть в выборку ? */
where dateadd(hour, a.n, start_data) < case when dateadd(hour, a.n+1, start_data) > end_data then end_data else dateadd(hour, a.n+1, start_data) end






statiststart_datatend_datatid_non
12t2020-03-14 09:00:00.000t2020-03-14 10:00:00.000t1
12t2020-03-14 10:00:00.000t2020-03-14 11:00:00.000t1
12t2020-03-14 11:00:00.000t2020-03-14 12:00:00.000t1
12t2020-03-14 12:00:00.000t2020-03-14 13:00:00.000t1
12t2020-03-14 13:00:00.000t2020-03-14 14:00:00.000t1
12t2020-03-14 14:00:00.000t2020-03-14 15:00:00.000t1
12t2020-03-14 15:00:00.000t2020-03-14 16:00:00.000t1
12t2020-03-14 16:00:00.000t2020-03-14 17:00:00.000t1
12t2020-03-14 17:00:00.000t2020-03-14 18:00:00.000t1
12t2020-03-14 18:00:00.000t2020-03-14 19:00:00.000t1
12t2020-03-14 19:00:00.000t2020-03-14 20:00:00.000t1
12t2020-03-14 20:00:00.000t2020-03-14 21:00:00.000t1
12t2020-03-14 21:00:00.000t2020-03-14 22:00:00.000t1
12t2020-03-14 22:00:00.000t2020-03-14 23:00:00.000t1
12t2020-03-14 23:00:00.000t2020-03-15 00:00:00.000t1
12t2020-03-15 00:00:00.000t2020-03-15 01:00:00.000t1
12t2020-03-15 01:00:00.000t2020-03-15 02:00:00.000t1
12t2020-03-15 02:00:00.000t2020-03-15 03:00:00.000t1
12t2020-03-15 03:00:00.000t2020-03-15 04:00:00.000t1
12t2020-03-15 04:00:00.000t2020-03-15 05:00:00.000t1
12t2020-03-15 05:00:00.000t2020-03-15 06:00:00.000t1
12t2020-03-15 06:00:00.000t2020-03-15 07:00:00.000t1
12t2020-03-15 07:00:00.000t2020-03-15 08:00:00.000t1
12t2020-03-15 08:00:00.000t2020-03-15 09:00:00.000t1
12t2020-03-15 09:00:00.000t2020-03-15 10:00:00.000t1
12t2020-03-15 10:00:00.000t2020-03-15 11:00:00.000t1
12t2020-03-15 11:00:00.000t2020-03-15 12:00:00.000t1
12t2020-03-15 12:00:00.000t2020-03-15 13:00:00.000t1
12t2020-03-15 13:00:00.000t2020-03-15 14:00:00.000t1
12t2020-03-15 14:00:00.000t2020-03-15 15:00:00.000t1
12t2020-03-15 15:00:00.000t2020-03-15 16:00:00.000t1
12t2020-03-15 16:00:00.000t2020-03-15 17:00:00.000t1
12t2020-03-15 17:00:00.000t2020-03-15 17:31:54.000t1
12t2020-03-15 17:31:54.000t2020-03-15 18:31:54.000t2
12t2020-03-15 18:31:54.000t2020-03-15 19:31:54.000t2
12t2020-03-15 19:31:54.000t2020-03-15 20:31:54.000t2
12t2020-03-15 20:31:54.000t2020-03-15 20:35:54.000t3

А как сделать в запросе проверку времени смены 12 часов

set dateformat ymd

declare @t table (statis int,	start_data datetime,	end_data datetime,	id_non int)
insert into @t values
(12,	'2020-03-14 07:00:00.000',	'2020-03-15 07:36:00.000',	1), -- тут надо разделить статус до 07:30:00 и после 07:30:00
(12,	'2020-03-15 07:36:00.000',	'2020-03-15 20:31:54.000',	2), -- так как этот статус попал в промежуток с  07:30:00 до 19:30:00 необходимо обрезать его и начать новый с 19:30:00 и продолжить его  до завершение end_data
(12,	'2020-03-15 20:31:54.000',	'2020-03-15 20:35:54.000',	3)

select * from @t


таблица должна получится


set dateformat ymd

declare @t table (statis int,	start_data datetime,	end_data datetime,	id_non int)
insert into @t values
(12,	'2020-03-14 07:00:00.000',	'2020-03-15 07:30:00.000',	1),
(12,	'2020-03-14 07:30:00.000',	'2020-03-15 07:36:00.000',	1),
(12,	'2020-03-15 07:36:00.000',	'2020-03-15 19:30:00.000',	2),
(12,	'2020-03-15 19:30:00.000',	'2020-03-15 20:31:54.000',	2), 
(12,	'2020-03-15 20:31:54.000',	'2020-03-15 20:35:54.000',	3)

select * from @t
... и где тут "12 часов" ...
24 мар 20, 11:12    [22104965]     Ответить | Цитировать Сообщить модератору
 Re: Получение интервала между двумя датами SQL  [new]
Иван_Перекрест
Member

Откуда:
Сообщений: 9
court,
Ошибку допустил
set dateformat ymd

declare @t table (statis int,	start_data datetime,	end_data datetime,	id_non int)
insert into @t values
(12,	'2020-03-15 07:00:00.000',	'2020-03-15 07:36:00.000',	1), -- тут надо разделить статус до 07:30:00 и после 07:30:00
(12,	'2020-03-15 07:36:00.000',	'2020-03-15 20:31:54.000',	2), -- так как этот статус попал в промежуток с  07:30:00 до 19:30:00 необходимо обрезать его и начать новый с 19:30:00 и продолжить его  до завершение end_data
(12,	'2020-03-15 20:31:54.000',	'2020-03-15 20:35:54.000',	3)
(12,	'2020-03-15 20:35:54.000',	'2020-03-16 07:40:00.000',	4)

select * from @t


set dateformat ymd

declare @t table (statis int,	start_data datetime,	end_data datetime,	id_non int)
insert into @t values
(12,	'2020-03-15 07:00:00.000',	'2020-03-15 07:30:00.000',	1),
(12,	'2020-03-15 07:30:00.000',	'2020-03-15 07:36:00.000',	1),
(12,	'2020-03-15 07:36:00.000',	'2020-03-15 19:30:00.000',	2),
(12,	'2020-03-15 19:30:00.000',	'2020-03-15 20:31:54.000',	2), 
(12,	'2020-03-15 20:31:54.000',	'2020-03-15 19:30:00.000',	3),
(12,	'2020-03-15 19:30:00.000',	'2020-03-15 20:35:54.000',	3),
(12,	'2020-03-15 20:35:54.000',	'2020-03-16 07:30:00.000',	4),
(12,	'2020-03-16 07:30:00.000',	'2020-03-16 07:40:00.000',	4)

select * from @t


12 часов должно начинаться с start_data 07:30 по end_data 19:30 в этот промежуток должны попасть все записи в таблице соответственно, с делением времени, если запись начало start_data 07:00 и конец end_data 07:35 ее нужно разделить до и после,
но нужно делать как и за определенную дату так и за интервал дат
24 мар 20, 12:42    [22105023]     Ответить | Цитировать Сообщить модератору
 Re: Получение интервала между двумя датами SQL  [new]
court
Member

Откуда:
Сообщений: 1956
Иван_Перекрест,

просто в исх. запросе, замени везде a.n на a.n * 12
24 мар 20, 17:36    [22105254]     Ответить | Цитировать Сообщить модератору
 Re: Получение интервала между двумя датами SQL  [new]
Иван_Перекрест
Member

Откуда:
Сообщений: 9
court,

Добрый день!
Попробовал поставить a.n*12, то от start_data вычисляется 12 часов и формируется end_data а остальное время просто обрезается и новая строчка не формируется. Так не пойдет.
Может создать функцию? которая будет выявлять и формировать статусы перетекающие из смены в смену.


set dateformat ymd

declare @t table (statis int,	start_data datetime,	end_data datetime,	id_non int)
insert into @t values
(12,	'2020-03-15 07:00:00.000',	'2020-03-15 07:36:00.000',	1), -- тут время перетикает статуса  одной смены в другую до 07:30:00 и после 07:30:00 этот статус нужно поделить до и после
(12,	'2020-03-15 07:36:00.000',	'2020-03-15 20:31:54.000',	2), -- так как этот статус попал в промежуток с  07:30:00 до 19:30:00 необходимо обрезать его и начать новый с 19:30:00 и продолжить его  до завершение end_data или следующей смены 
(12,	'2020-03-15 20:31:54.000',	'2020-03-15 20:35:54.000',	3),
(12,	'2020-03-15 20:35:54.000',	'2020-03-16 07:40:00.000',	4)

select * from @t

12 2020-03-15 07:00:00.000 2020-03-15 07:36:00.000 1
12 2020-03-15 07:36:00.000 2020-03-15 20:31:54.000 2
12 2020-03-15 20:31:54.000 2020-03-15 20:35:54.000 3
12 2020-03-15 20:35:54.000 2020-03-16 07:40:00.000 4

set dateformat ymd

declare @t table (statis int,	start_data datetime,	end_data datetime,	id_non int)
insert into @t values
(12,	'2020-03-15 07:00:00.000',	'2020-03-15 07:30:00.000',	1), --это отнесется к 2 смене
(12,	'2020-03-15 07:30:00.000',	'2020-03-15 07:36:00.000',	1), --это отнесется к 1 смене
(12,	'2020-03-15 07:36:00.000',	'2020-03-15 19:30:00.000',	2), --это отнесется к 1 смене
(12,	'2020-03-15 19:30:00.000',	'2020-03-15 20:31:54.000',	2), -- это отнесется к 2 смене
(12,	'2020-03-15 20:31:54.000',	'2020-03-15 20:35:54.000',	3),  --это отнесется к 2 смене
(12,	'2020-03-15 20:35:54.000',	'2020-03-16 07:30:00.000',	4), --это отнесется к 2 смене
(12,	'2020-03-16 07:30:00.000',	'2020-03-16 07:40:00.000',	4)  --это отнесется к 1 смене

select * from @t

12 2020-03-15 07:00:00.000 2020-03-15 07:30:00.000 1
12 2020-03-15 07:30:00.000 2020-03-15 07:36:00.000 1
12 2020-03-15 07:36:00.000 2020-03-15 19:30:00.000 2
12 2020-03-15 19:30:00.000 2020-03-15 20:31:54.000 2
12 2020-03-15 20:31:54.000 2020-03-15 20:35:54.000 3
12 2020-03-15 20:35:54.000 2020-03-16 07:30:00.000 4
12 2020-03-16 07:30:00.000 2020-03-16 07:40:00.000 4
25 мар 20, 08:16    [22105513]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить