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

Откуда: Republic of Belarus
Сообщений: 451
Доброе утро.
Имееться набор данных следующего вида:

ID DATETIME
1 1899-12-30 08:35
2 1899-12-30 10:46
3 1899-12-30 14:12
4 1899-12-30 20:56
5 1899-12-30 23:00
6 1899-12-30 06:34
7 1899-12-30 12:00
8 1899-12-30 14:12
9 1899-12-30 23:00


Также имееться входной параметр вида: 10-10-2009 09:00 (время тут не важно)
Мне необходимо получить набор данных следующего вида:

ID DATETIME
1 10-10-2009 08:35
2 10-10-2009 10:46
3 10-10-2009 14:12
4 10-10-2009 20:56
5 10-10-2009 23:00
6 11-10-2009 06:34
7 11-10-2009 12:00
8 11-10-2009 14:12
9 11-10-2009 23:00


Как это сделать на курсорах, я знаю, а вот как сделать это одном запросом? Основная проблемма - это как определить, что пошли следующие сутки.
Буду премного благодарен за помощь :)
16 окт 09, 10:37    [7795139]     Ответить | Цитировать Сообщить модератору
 Re: Помогите решить задачку с датами  [new]
LexMinsk
Member

Откуда: Republic of Belarus
Сообщений: 451
Microsoft SQL Server 2005 - 9.00.4035.00 (Intel X86) Nov 24 2008 13:01:59 Copyright (c) 1988-2005 Microsoft Corporation Enterprise Edition on Windows NT 5.2 (Build 3790: Service Pack 2)
16 окт 09, 10:38    [7795144]     Ответить | Цитировать Сообщить модератору
 Re: Помогите решить задачку с датами  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10234
Блог
в итоге что нужно-то? сменить дату 1899-12-30 на 10-10-2009 ?
16 окт 09, 10:40    [7795158]     Ответить | Цитировать Сообщить модератору
 Re: Помогите решить задачку с датами  [new]
Glory
Member

Откуда:
Сообщений: 104760
LexMinsk

Как это сделать на курсорах, я знаю, а вот как сделать это одном запросом?

Т.е. в курсоре вы можете извлечеть из двух DATETIME только DATE и только TIME, а без курсора уже не можете ?
Не затруднит ли вас привести скрипт с этим курсором ?
16 окт 09, 10:41    [7795160]     Ответить | Цитировать Сообщить модератору
 Re: Помогите решить задачку с датами  [new]
LexMinsk
Member

Откуда: Republic of Belarus
Сообщений: 451
Knyazev Alexey
в итоге что нужно-то? сменить дату 1899-12-30 на 10-10-2009 ?

Да, на 10-10-2009 или на 11-10-2009 с учетом перехода времени в первом наборе данных на новые сутки. Входная дата может быть любая.
16 окт 09, 10:43    [7795184]     Ответить | Цитировать Сообщить модератору
 Re: Помогите решить задачку с датами  [new]
Glory
Member

Откуда:
Сообщений: 104760
LexMinsk
Knyazev Alexey
в итоге что нужно-то? сменить дату 1899-12-30 на 10-10-2009 ?

Да, на 10-10-2009 или на 11-10-2009 с учетом перехода времени в первом наборе данных на новые сутки. Входная дата может быть любая.

Т.е. у вас время всегда возрастает в соответствии с id что ли ?
16 окт 09, 10:48    [7795216]     Ответить | Цитировать Сообщить модератору
 Re: Помогите решить задачку с датами  [new]
LexMinsk
Member

Откуда: Republic of Belarus
Сообщений: 451
Glory
LexMinsk

Как это сделать на курсорах, я знаю, а вот как сделать это одном запросом?

Т.е. в курсоре вы можете извлечеть из двух DATETIME только DATE и только TIME, а без курсора уже не можете ?
Не затруднит ли вас привести скрипт с этим курсором ?


В курсоре я могу запомнить предыдущее значение времени (допустим T1) и сравнить его с текущим (допустим T2). И если T1 > T2, то значит начались новые сутки и к входной дате надо прибавить 1 день.
А как эту ситуацию отследить в selecte? Ранжитьвать выборку, склеивать ее саму с собой, где RowNumber1 = RowNumber2 -1, получать ID записи, где происходит переход на новые сутки, а потом опять делать выборку с учетом полученной?
16 окт 09, 10:50    [7795233]     Ответить | Цитировать Сообщить модератору
 Re: Помогите решить задачку с датами  [new]
Glory
Member

Откуда:
Сообщений: 104760
LexMinsk

А как эту ситуацию отследить в selecte? Ранжитьвать выборку, склеивать ее саму с собой, где RowNumber1 = RowNumber2 -1, получать ID записи, где происходит переход на новые сутки, а потом опять делать выборку с учетом полученной?

Хм. Согласно приведенному посту выборка у вас уже ранжирована
16 окт 09, 10:53    [7795275]     Ответить | Цитировать Сообщить модератору
 Re: Помогите решить задачку с датами  [new]
LexMinsk
Member

Откуда: Republic of Belarus
Сообщений: 451
Glory
LexMinsk
Knyazev Alexey
в итоге что нужно-то? сменить дату 1899-12-30 на 10-10-2009 ?

Да, на 10-10-2009 или на 11-10-2009 с учетом перехода времени в первом наборе данных на новые сутки. Входная дата может быть любая.

Т.е. у вас время всегда возрастает в соответствии с id что ли ?


ID - это порядковый номер посещения объекта. DATETIME - это время посещения. В целом весь набор данных составляет расписание посещения объекта. Это расписание может быть составлено на несколько суток, поэтому допустим дата 1899-12-30 08:35 может присутствовать в наборе несколько раз, но с разными ID.
Поэтому если расписание составлено на 3-е суток и начало допустим 10-10-2009, то мне надо получить:
10-10-2009 08:35
...
11-10-2009 08:35
...
12-10-2009 08:35
...
16 окт 09, 10:55    [7795287]     Ответить | Цитировать Сообщить модератору
 Re: Помогите решить задачку с датами  [new]
Glory
Member

Откуда:
Сообщений: 104760
LexMinsk
Glory
LexMinsk
Knyazev Alexey
в итоге что нужно-то? сменить дату 1899-12-30 на 10-10-2009 ?

Да, на 10-10-2009 или на 11-10-2009 с учетом перехода времени в первом наборе данных на новые сутки. Входная дата может быть любая.

Т.е. у вас время всегда возрастает в соответствии с id что ли ?


ID - это порядковый номер посещения объекта. DATETIME - это время посещения.

Т.е. значения ID, которые вы показали, не соответствуют реальным значениям ? Или как вас понимать ?
16 окт 09, 10:57    [7795301]     Ответить | Цитировать Сообщить модератору
 Re: Помогите решить задачку с датами  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10234
Блог
5 1899-12-30 23:00
6 1899-12-30 06:34


а где тут признак, что вторая дата -это уже следующий день?
16 окт 09, 10:59    [7795317]     Ответить | Цитировать Сообщить модератору
 Re: Помогите решить задачку с датами  [new]
baracs
Member

Откуда: Москва
Сообщений: 7198
LexMinsk
Основная проблемма - это как определить, что пошли следующие сутки.

Есть функция DATEDIFF...
16 окт 09, 11:04    [7795363]     Ответить | Цитировать Сообщить модератору
 Re: Помогите решить задачку с датами  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
SET NOCOUNT ON;
DECLARE @T TABLE(ID INT NOT NULL IDENTITY, D DATETIME);
INSERT @T(D) VALUES('18991230 08:35');
INSERT @T(D) VALUES('18991230 10:46');
INSERT @T(D) VALUES('18991230 14:12');
INSERT @T(D) VALUES('18991230 20:56');
INSERT @T(D) VALUES('18991230 23:00');
INSERT @T(D) VALUES('18991230 06:34');
INSERT @T(D) VALUES('18991230 12:00');
INSERT @T(D) VALUES('18991230 14:12');
INSERT @T(D) VALUES('18991230 23:00');

DECLARE @D DATETIME='20091010 09:00';

WITH CTE AS(SELECT ROW_NUMBER()OVER(ORDER BY ID) N, * FROM @T)
SELECT DATEADD(DAY, COUNT(CTE2.ID)+DATEDIFF(DAY,0,@D), DATEADD(DAY,-DATEDIFF(DAY,0,T.D),T.D))
FROM @T T JOIN CTE CTE1 ON T.ID>=CTE1.ID LEFT JOIN CTE CTE2 ON CTE1.N=CTE2.N+1 AND CTE1.D<CTE2.D
GROUP BY T.ID,T.D
ORDER BY T.ID;
16 окт 09, 11:38    [7795660]     Ответить | Цитировать Сообщить модератору
 Re: Помогите решить задачку с датами  [new]
LexMinsk
Member

Откуда: Republic of Belarus
Сообщений: 451
Вот как это сделано на курсоре
DECLARE @ORDERNUMBER2 INT
DECLARE @CONTROL_TIME2 DATETIME

DECLARE @START_TIME DATETIME
DECLARE @NORMAL_TIME DATETIME

DECLARE CRS_SCHDULE_PLAN CURSOR LOCAL STATIC FOR
                    SELECT 
                     T1.ORDERNUMBER,
                     T1.CONTROLTIME
                    FROM SCHEDULE_PLAN AS T1
                    WHERE ID_SCHEDULE = 9
                    ORDER BY T1.ORDERNUMBER

OPEN CRS_SCHDULE_PLAN

SET @START_TIME = CONVERT(DATETIME, '2009-10-30 10:00', 120)

SET @NORMAL_TIME = @START_TIME
FETCH FIRST
FROM CRS_SCHDULE_PLAN
INTO @ORDERNUMBER2, @CONTROL_TIME2
SET @ORDERNUMBER1 = @ORDERNUMBER2
SET @CONTROL_TIME1 = @CONTROL_TIME2

WHILE @@FETCH_STATUS = 0
 BEGIN 
  SET @NORMAL_TIME = CONVERT(DATETIME, CONVERT(VARCHAR, @NORMAL_TIME, 102) + ' ' + CONVERT (VARCHAR, @CONTROL_TIME2, 108), 120)

  IF (@CONTROL_TIME1 > @CONTROL_TIME2)
   SET @NORMAL_TIME = DATEADD(DD, 1, @NORMAL_TIME)

  SELECT @ORDERNUMBER2, @NORMAL_TIME, @CONTROL_TIME1, @CONTROL_TIME2

  SET @ORDERNUMBER1 = @ORDERNUMBER2
  SET @CONTROL_TIME1 = @CONTROL_TIME2
  FETCH NEXT
  FROM CRS_SCHDULE_PLAN
  INTO @ORDERNUMBER2, @CONTROL_TIME2
 END

CLOSE CRS_SCHDULE_PLAN
DEALLOCATE CRS_SCHDULE_PLAN

16 окт 09, 11:41    [7795679]     Ответить | Цитировать Сообщить модератору
 Re: Помогите решить задачку с датами  [new]
LexMinsk
Member

Откуда: Republic of Belarus
Сообщений: 451
Было:

1 1899-12-30 08:30:00.000
2 1899-12-30 11:00:00.000
3 1899-12-30 14:30:00.000
4 1899-12-30 16:30:00.000
5 1899-12-30 17:30:00.000
6 1899-12-30 19:00:00.000
7 1899-12-30 10:30:00.000
8 1899-12-30 15:00:00.000
9 1899-12-30 18:00:00.000
10 1899-12-30 19:00:00.000

Стало:

1 2009-10-30 08:30:00.000
2 2009-10-30 11:00:00.000
3 2009-10-30 14:30:00.000
4 2009-10-30 16:30:00.000
5 2009-10-30 17:30:00.000
6 2009-10-30 19:00:00.000
7 2009-10-31 10:30:00.000
8 2009-10-31 15:00:00.000
9 2009-10-31 18:00:00.000
10 2009-10-31 19:00:00.000
16 окт 09, 11:44    [7795708]     Ответить | Цитировать Сообщить модератору
 Re: Помогите решить задачку с датами  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
LexMinsk,

кто такой тетерев-косач, знаете?
16 окт 09, 12:08    [7795919]     Ответить | Цитировать Сообщить модератору
 Re: Помогите решить задачку с датами  [new]
MCTS
Guest
Для скул екса полюбому задачу делает)
16 окт 09, 12:10    [7795935]     Ответить | Цитировать Сообщить модератору
 Re: Помогите решить задачку с датами  [new]
aleks2
Guest
SET NOCOUNT ON;
DECLARE @T TABLE(ID INT NOT NULL IDENTITY, D DATETIME);
INSERT @T(D) VALUES('18991230 08:35');
INSERT @T(D) VALUES('18991230 10:46');
INSERT @T(D) VALUES('18991230 14:12');
INSERT @T(D) VALUES('18991230 20:56');
INSERT @T(D) VALUES('18991230 23:00');
INSERT @T(D) VALUES('18991230 06:34');
INSERT @T(D) VALUES('18991230 12:00');
INSERT @T(D) VALUES('18991230 14:12');
INSERT @T(D) VALUES('18991230 23:00');

DECLARE @D DATETIME, @id int, @dd int
set @D='20091010 09:00'

set @D=datediff(day, 0, @d)
set @dd=1

select TOP 1 @id=T2.id 
FROM @T T1 INNER JOIN @T T2
ON T1.D>T2.D AND T1.ID<T2.ID
ORDER BY T2.ID ASC

while @id is not null begin
  update T SET D=D+@dd
  FROM @t T
  WHERE id>=@id

  set @dd=@dd+1
  set @id=null

  select TOP 1 @id=T2.id 
  FROM @T T1 INNER JOIN @T T2
  ON T1.D>T2.D AND T1.ID<T2.ID
  ORDER BY T2.ID ASC
end

update T SET D=D+@D
FROM @t T

select * from @t
16 окт 09, 12:19    [7795990]     Ответить | Цитировать Сообщить модератору
 Re: Помогите решить задачку с датами  [new]
LexMinsk
Member

Откуда: Republic of Belarus
Сообщений: 451
iap
LexMinsk,

кто такой тетерев-косач, знаете?

Птица какая то наверное :)
16 окт 09, 12:34    [7796098]     Ответить | Цитировать Сообщить модератору
 Re: Помогите решить задачку с датами  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
LexMinsk
iap
LexMinsk,

кто такой тетерев-косач, знаете?

Птица какая то наверное :)
Правильно. Когда она токует, то ничего вокруг не замечает.
Уже не одно решение тут накидали, а от Вас - ни ответа, ни привета!
16 окт 09, 12:44    [7796183]     Ответить | Цитировать Сообщить модератору
 Re: Помогите решить задачку с датами  [new]
LexMinsk
Member

Откуда: Republic of Belarus
Сообщений: 451
MCTS
Для скул екса полюбому задачу делает)

А что такое "скул екса" ?
16 окт 09, 12:48    [7796221]     Ответить | Цитировать Сообщить модератору
 Re: Помогите решить задачку с датами  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
MCTS
Для скул екса полюбому задачу делает)
А разве на http://www.sql-ex.ru курсорами можно?
(я-то не в курсе, ничего там не смотрел )
16 окт 09, 12:51    [7796244]     Ответить | Цитировать Сообщить модератору
 Re: Помогите решить задачку с датами  [new]
LexMinsk
Member

Откуда: Republic of Belarus
Сообщений: 451
iap
LexMinsk
iap
LexMinsk,

кто такой тетерев-косач, знаете?

Птица какая то наверное :)
Правильно. Когда она токует, то ничего вокруг не замечает.
Уже не одно решение тут накидали, а от Вас - ни ответа, ни привета!


Уважаемый, iap, я видел ваше решение, когда выкладывал свой пример с курсором. Просто несколькими постами выше меня попросили его выложить. Ну и так сказать, чтобы не выглядеть халявщиком, в глазах уважаемых форумчан, я его выложил :)

Всем спасибо, кто помогал :)
16 окт 09, 12:54    [7796264]     Ответить | Цитировать Сообщить модератору
 Re: Помогите решить задачку с датами  [new]
LexMinsk
Member

Откуда: Republic of Belarus
Сообщений: 451
iap
MCTS
Для скул екса полюбому задачу делает)
А разве на http://www.sql-ex.ru курсорами можно?
(я-то не в курсе, ничего там не смотрел )

Ничего про этот сайт не знаю.
16 окт 09, 12:59    [7796314]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить