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

Откуда: Санкт-Петербург
Сообщений: 520
Добрый день!

Есть таблица с историей работы системы:
create table #t (ids int, idf int, sdt datetime, edt datetime, ddt datetime)


поле ids принимает значения от 1 до 12, поле idf принимает значения 2 или 3.
sdt - первоначальная дата, edt - финальная дата, ddt - разница между edt и sdt.

Задача:
Найти в таблице записи с флагом idf=2 удовлетворяющие следующим условиям:
1. sdt записи(флаг=2) меньше sdt записи (флаг=3) и edt записи (флаг=2) меньше edt записи(флаг=3)
В графическом виде
sdt(2)-------------------edt(2)
sdt(3)--------------edt(3)
2. sdt записи(флаг=2) больше sdt записи (флаг=3) и edt записи (флаг=2) меньше edt записи(флаг=3)
В графическом виде
sdt(2)-----------edt(2)
sdt(3)----------------------------edt(3)

Написал следующий код:
	select
	t.ids as idSt,
	t.idf as idFlag,
	,sum(datediff(Second,0,t.ddt)-7) as cnt
	from #t t
	where
		idf=2 and
		(
		edt between (select top 1 sdt from #t where idf=3 and ids=t.ids+1 and sdt<=t.sdt and edt>=t.edt) and
		(select top 1 edt from #t where idf=3 and ids=t.ids+1 and sdt<=t.sdt and edt>=t.edt)
		or
		edt between (select top 1 sdt from #t where idf=3 and ids=t.ids+1 and sdt>=t.sdt and edt>=t.edt) and
		(select top 1 edt from #t where idf=3 and ids=t.ids+1 and sdt>=t.sdt and edt>=t.edt)
		)
		and
		DATEDIFF(SECOND,0,ddt)-7>0
	group by
		t.ids,
		t.idf
	order by ids, idf


Все вроде бы считается, но есть печальный ньюанс.
Если таблицу наполнить соседними данными (например, ids равно 2 и 3), то результат поля CNT становится одним,
а если наполнить таблицу всеми данными (ids от 1 до 12), то другим :(

Как мне исправить данный код для корректных расчетов?

Спасибо.

Никогда не бойся делать то, что не умеешь.
Помни, профессионалы построили Титаник, а Ковчег любители.
19 апр 17, 11:51    [20413747]     Ответить | Цитировать Сообщить модератору
 Re: Работа с датами, суммирование результатов  [new]
Kast2K
Member

Откуда: Санкт-Петербург
Сообщений: 520
Графический вид съехал
1. sdt записи(флаг=2) меньше sdt записи (флаг=3) и edt записи (флаг=2) меньше edt записи(флаг=3)
В графическом виде
sdt(2)-------------------edt(2)
......................sdt(3)--------------edt(3)
2. sdt записи(флаг=2) больше sdt записи (флаг=3) и edt записи (флаг=2) меньше edt записи(флаг=3)
В графическом виде
.............sdt(2)-----------edt(2)
sdt(3)----------------------------edt(3)
19 апр 17, 11:52    [20413751]     Ответить | Цитировать Сообщить модератору
 Re: Работа с датами, суммирование результатов  [new]
Добрый Э - Эх
Guest
Kast2K
Добрый день!

Есть таблица с историей работы системы:
create table #t (ids int, idf int, sdt datetime, edt datetime, ddt datetime)


поле ids принимает значения от 1 до 12, поле idf принимает значения 2 или 3.
sdt - первоначальная дата, edt - финальная дата, ddt - разница между edt и sdt.

Задача:
Найти в таблице записи с флагом idf=2 удовлетворяющие следующим условиям:
1. sdt записи(флаг=2) меньше sdt записи (флаг=3) и edt записи (флаг=2) меньше edt записи(флаг=3)
В графическом виде
   sdt(2)-------------------edt(2)
sdt(3)--------------edt(3)
2. sdt записи(флаг=2) больше sdt записи (флаг=3) и edt записи (флаг=2) меньше edt записи(флаг=3)
В графическом виде
            sdt(2)-----------edt(2)
sdt(3)----------------------------edt(3)

Написал следующий код:
	select
	t.ids as idSt,
	t.idf as idFlag,
	,sum(datediff(Second,0,t.ddt)-7) as cnt
	from #t t
	where
		idf=2 and
		(
		edt between (select top 1 sdt from #t where idf=3 and ids=t.ids+1 and sdt<=t.sdt and edt>=t.edt) and
		(select top 1 edt from #t where idf=3 and ids=t.ids+1 and sdt<=t.sdt and edt>=t.edt)
		or
		edt between (select top 1 sdt from #t where idf=3 and ids=t.ids+1 and sdt>=t.sdt and edt>=t.edt) and
		(select top 1 edt from #t where idf=3 and ids=t.ids+1 and sdt>=t.sdt and edt>=t.edt)
		)
		and
		DATEDIFF(SECOND,0,ddt)-7>0
	group by
		t.ids,
		t.idf
	order by ids, idf


Все вроде бы считается, но есть печальный ньюанс.
Если таблицу наполнить соседними данными (например, ids равно 2 и 3), то результат поля CNT становится одним,
а если наполнить таблицу всеми данными (ids от 1 до 12), то другим :(

Как мне исправить данный код для корректных расчетов?

Спасибо.

Никогда не бойся делать то, что не умеешь.
Помни, профессионалы построили Титаник, а Ковчег любители.
19 апр 17, 12:16    [20413869]     Ответить | Цитировать Сообщить модератору
 Re: Работа с датами, суммирование результатов  [new]
Добрый Э - Эх
Guest
Kast2K,

лучше приведи юзабильный репрезентативный набор тестовых данных, чем свою "псевдографику" + желаемый вид результата
19 апр 17, 12:19    [20413883]     Ответить | Цитировать Сообщить модератору
 Re: Работа с датами, суммирование результатов  [new]
Kast2K
Member

Откуда: Санкт-Петербург
Сообщений: 520
тестовый набор данных.
rowidsidfsdtedtddtжелаемое
13 3 2017-04-18 12:56:13.237 2017-04-18 12:56:58.183 00:00:44.947
22 2 2017-04-18 12:56:40.697 2017-04-18 12:56:53.670 00:00:12.973да1
33 3 2017-04-18 13:37:02.227 2017-04-18 13:37:49.240 00:00:47.013
42 2 2017-04-18 13:37:36.107 2017-04-18 13:37:44.423 00:00:08.317да2
53 2 2017-04-19 08:43:36.157 2017-04-19 08:45:02.720 00:01:26.563да3
64 3 2017-04-19 08:44:47.060 2017-04-19 08:45:11.097 00:00:24.037


разъяснения:
ДА1 - т.к. sdt и edt входят в диапазон sdt edt строки 1, где ids больше на 1 (условие)
ДА2 - т.к. sdt и edt входят в диапазон sdt edt строки 3, где ids больше на 1 (условие)
ДА3 - т.к. sdt меньше sdt строки 6, а edt входят в диапазон sdt edt строки 6, где ids больше на 1 (условие)

Очень надеюсь, что вы меня понимаете :)
19 апр 17, 12:44    [20414036]     Ответить | Цитировать Сообщить модератору
 Re: Работа с датами, суммирование результатов  [new]
aleks2
Guest
Kast2K
тестовый набор данных.
rowidsidfsdtedtddtжелаемое
13 3 2017-04-18 12:56:13.237 2017-04-18 12:56:58.183 00:00:44.947
22 2 2017-04-18 12:56:40.697 2017-04-18 12:56:53.670 00:00:12.973да1
33 3 2017-04-18 13:37:02.227 2017-04-18 13:37:49.240 00:00:47.013
42 2 2017-04-18 13:37:36.107 2017-04-18 13:37:44.423 00:00:08.317да2
53 2 2017-04-19 08:43:36.157 2017-04-19 08:45:02.720 00:01:26.563да3
64 3 2017-04-19 08:44:47.060 2017-04-19 08:45:11.097 00:00:24.037


разъяснения:
ДА1 - т.к. sdt и edt входят в диапазон sdt edt строки 1, где ids больше на 1 (условие)
ДА2 - т.к. sdt и edt входят в диапазон sdt edt строки 3, где ids больше на 1 (условие)
ДА3 - т.к. sdt меньше sdt строки 6, а edt входят в диапазон sdt edt строки 6, где ids больше на 1 (условие)

Очень надеюсь, что вы меня понимаете :)


ну дык, ты ж все написал.

with t as ( select * from [тестовый набор данных] )
  select * 
    from  t
    where exists( select * from t as tt where tt.ids = t.ids + 1 and tt.sdt < t.edt and t.sdt < tt.edt )
19 апр 17, 13:59    [20414509]     Ответить | Цитировать Сообщить модератору
 Re: Работа с датами, суммирование результатов  [new]
Kast2K
Member

Откуда: Санкт-Петербург
Сообщений: 520
Коллеги,
вопрос снят.

Стыжусь, приведенный код тестировал на нулевых датах (2017-04-18 00:00:00 - 2017-04-19 00:00:00),
а при переносе в программу даты были такие же, только время было указано иное.
Отсюда и возник вопрос, отчего результаты разные.

Заработался, одним словом.
19 апр 17, 14:50    [20414906]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить