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

Откуда: Воронеж
Сообщений: 275
Есть таблица с хронометражем работы производственных линий. Выглядит как столбцы:

[DateTime] Operat Length
01.10.04 8:00 1 0
01.10.04 9:30 2 800
01.10.04 13:00 2 1850
01.10.04 18:20 4 8000

Мне нужно сделать запрос который выдавал бы длительность каждой операции в минутах

Т.е. DateDiff (minute, T2, T1).
Не подскажет мне кто нить как это сделать? Таблица tbl_ShiftProt.
15 окт 04, 12:45    [1036899]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на Datediff... никак до меня не доходит как это написать(  [new]
Tracer
Member

Откуда:
Сообщений: 728
если Length - длительность в сек
то
select Length/360 from tbl_ShiftProt
15 окт 04, 12:48    [1036911]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на Datediff... никак до меня не доходит как это написать(  [new]
Glory
Member

Откуда:
Сообщений: 104760
select oper, sum(length)/60.00
from mytable
group by oper
15 окт 04, 12:50    [1036927]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на Datediff... никак до меня не доходит как это написать(  [new]
GliderAlex
Member

Откуда: Воронеж
Сообщений: 275
Нет. Length это физич длина в метрах выпущенной продукции, это вообще не при чём.
Мне сказали это сделать как то через виртуальные таблицы, но как?( Я не в курсе.
15 окт 04, 12:52    [1036933]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на Datediff... никак до меня не доходит как это написать(  [new]
GliderAlex
Member

Откуда: Воронеж
Сообщений: 275
Нужно сделать разницу между временем в первом столбце. Т.е. 01.10.04 9:30 вычесть 01.10.04 8:00 и полученное в минутах вывести. И т.д.


01.10.04 13:00 вычесть 01.10.04 9:30
01.10.04 18:20 вычесть 01.10.04 13:00
15 окт 04, 12:56    [1036960]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на Datediff... никак до меня не доходит как это написать(  [new]
злой программер
Member

Откуда:
Сообщений: 226
Попробуй это:
SET DATEFORMAT DMY
DECLARE @DD dateTime
SELECT @DD = '20-11-2004 18:20'

SELECT CAST(CAST(DATEPART(HH,@DD) AS VARCHAR(10)) + ':' + CAST(DATEPART(MI,@DD) AS VARCHAR(10)) AS DATETIME)
15 окт 04, 13:01    [1037003]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на Datediff... никак до меня не доходит как это написать(  [new]
Glory
Member

Откуда:
Сообщений: 104760
Интересно, а что будет результатом для таких входных данных

01.10.04 8:00 1 0
01.10.04 9:30 2 800
01.10.04 13:00 2 1850
01.10.04 15:00 2 850
01.10.04 18:20 4 8000
15 окт 04, 13:04    [1037025]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на Datediff... никак до меня не доходит как это написать(  [new]
злой программер
Member

Откуда:
Сообщений: 226
Glory
Интересно, а что будет результатом для таких входных данных

01.10.04 8:00 1 0
01.10.04 9:30 2 800
01.10.04 13:00 2 1850
01.10.04 15:00 2 850
01.10.04 18:20 4 8000


1900-01-01 15:00:00.000
15 окт 04, 13:18    [1037102]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на Datediff... никак до меня не доходит как это написать(  [new]
Glory
Member

Откуда:
Сообщений: 104760
2злой программер
Извиняюсь - это был вопрос к GliderAlex.
Потому что так, как я понял задачу, нужно для каждой записи искать запись с предыдущей датой.
15 окт 04, 13:19    [1037111]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на Datediff... никак до меня не доходит как это написать(  [new]
злой программер
Member

Откуда:
Сообщений: 226
Glory
2злой программер
Извиняюсь - это был вопрос к GliderAlex.
Потому что так, как я понял задачу, нужно для каждой записи искать запись с предыдущей датой.


Glory, наверное Вы правы, я не вполне понял GliderAlex. Но тогда похоже, без временной таблицы не обойтись.
15 окт 04, 13:23    [1037138]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на Datediff... никак до меня не доходит как это написать(  [new]
Eldar
Member

Откуда:
Сообщений: 329
Не до конца понял смысл столбца Operat

create table  tbl_ShiftProt 
              (date1 datetime)


insert into tbl_ShiftProt 
	select '20041015 15:00'
	union select '20041015 15:10'
	union select '20041015 15:43'
        union select '20041015 17:10'

select datediff(mi, date1, (select top 1 date1
					from tbl_ShiftProt t2
					where t2.date1>t1.date1))
from tbl_ShiftProt t1
15 окт 04, 13:33    [1037198]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на Datediff... никак до меня не доходит как это написать(  [new]
GliderAlex
Member

Откуда: Воронеж
Сообщений: 275
Да нет же... К данным в таблице вообще не нужно привязываться(
Фактически к задаче относится только один столбец.
Есть таблица даты-времени выполнения операций tbl_ShiftProt

01.10.04 8:00
01.10.04 9:30
01.10.04 13:00
01.10.04 18:20
и т.д до бесконечности

Нужно сделать запрос который бы давал длительность каждой операции т.е. интервал в минутах между этими значениями.

У меня какие то идеи бродят а вот как их реализовать не знаю

Нужно в запросе вызвать два раза таблицу tbl_ShiftProt, дать ей алиасы t1 и t2. Сделать селект
datadiff(minute,t2,t1)
А таблицы обьеденить по условию что t2 это максимальное значение меньшее t1. По моему так... Вот написать я это не могу. Помогите. Плз.
15 окт 04, 15:03    [1037638]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на Datediff... никак до меня не доходит как это написать(  [new]
злой программер
Member

Откуда:
Сообщений: 226
GliderAlex, если я вас правильно понял, то нечетные записи в таблице - начало операции, а непосредственно следующие за ним четные - конец операции ?
15 окт 04, 15:37    [1037812]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на Datediff... никак до меня не доходит как это написать(  [new]
GliderAlex
Member

Откуда: Воронеж
Сообщений: 275
Каждое дата-время это конец предыдущей операции и начало следующей.
Т.е. рабочий день начался в 8:00, в 9:30 ,например была остановка линии и продлилась она до 13:00 по каким либо причинам, потом с 13:00 до18:20 опять работала и т.д. и т.д.
Нужно считать временные интервалы в минутах
Сколько минут там работала, стояла, ещё чего, это неважно... Это уже всё выборки.
15 окт 04, 15:44    [1037848]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на Datediff... никак до меня не доходит как это написать(  [new]
Glory
Member

Откуда:
Сообщений: 104760
select datediff(mi, date1, (select top 1 date1
					from tbl_ShiftProt t2
					where t2.date1<t1.date1
order by date1 desc)
)
from tbl_ShiftProt t1
15 окт 04, 15:50    [1037875]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на Datediff... никак до меня не доходит как это написать(  [new]
GliderAlex
Member

Откуда: Воронеж
Сообщений: 275
Спасибо большое)) Вот в таком виде начал работать.
SELECT DATEDIFF(mi, DateTime,
(SELECT TOP 1 t2.DateTime
FROM tbl_ShiftProtocol t2
WHERE t2.DateTime > t1.DateTime
ORDER BY t1.DateTime DESC)) AS Expr1
FROM dbo.tbl_ShiftProtocol t1

Очень благодарен.
15 окт 04, 16:19    [1038006]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на Datediff... никак до меня не доходит как это написать(  [new]
AAron
Member

Откуда: Москва
Сообщений: 4324
Я почти такой же тестовый вопрос на собеседовании задаю :)
15 окт 04, 19:45    [1038794]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на Datediff... никак до меня не доходит как это написать(  [new]
GliderAlex
Member

Откуда: Воронеж
Сообщений: 275
Ну мне не для собеседования) Да я и не профессиональный программер, я типа как юзер, ну может чуток продвинутый... Просто пытаюсь сделать автоматическую программу анализа производства вот и задаю всякие вопросы.))
18 окт 04, 09:49    [1040443]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на Datediff... никак до меня не доходит как это написать(  [new]
GliderAlex
Member

Откуда: Воронеж
Сообщений: 275
Вот с таким вот запросом

SELECT ID_Line, DATEDIFF(mi, DateTime,
(SELECT TOP 1 t2.DateTime
FROM tbl_ShiftProtocol t2
WHERE t2.DateTime < t1.DateTime AND ID_Line = 1
ORDER BY t2.DateTime DESC)) AS Time, DateTime
FROM dbo.tbl_ShiftProtocol t1
WHERE (ID_Line = 1)

Получаю вот такой вот результат:

ID_Line Time DateTime
1 04.01.03 20:00:00
1 -40 04.01.03 20:40:00
1 -10 04.01.03 20:50:00
1 -50 04.01.03 21:40:00
1 -15 04.01.03 21:55:00
1 -50 04.01.03 22:45:00
1 -15 04.01.03 23:00:00
1 -50 04.01.03 23:50:00
1 -70 05.01.03 1:00:00
1 -15 05.01.03 1:15:00
1 -45 05.01.03 2:00:00
1 -360 05.01.03 8:00:00
1 -720 05.01.03 20:00:00
1 -70 05.01.03 21:10:00
1 -10 05.01.03 21:20:00
1 -45 05.01.03 22:05:00
1 -595 06.01.03 8:00:00
1 -100 06.01.03 9:40:00
1 -45 06.01.03 10:25:00

То что минусовые значения это ерунда, их делаешь абсолютными, так вроде всё нормально но тормозит жутко((( А Query Analyzer вообще не хочет рассматривать таой запрос, пишет

[Microsoft][ODBC SQL Server Driver][DBNETLIB]ConnectionRead (WrapperRead()).
Server: Msg 11, Level 16, State 1, Line 0
ODBC: Msg 0, Level 16, State 1
Ошибка связи.

Как его можно оптимизировать не подскажите?
21 окт 04, 15:26    [1051999]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на Datediff... никак до меня не доходит как это написать(  [new]
GliderAlex
Member

Откуда: Воронеж
Сообщений: 275
Извиняюсь, табличка выглядит во так

ID_Line Time DateTime
1 04.01.03 20:00:00
1 -40 04.01.03 20:40:00
1 -10 04.01.03 20:50:00
1 -50 04.01.03 21:40:00
1 -15 04.01.03 21:55:00
1 -50 04.01.03 22:45:00
1 -15 04.01.03 23:00:00
1 -50 04.01.03 23:50:00
1 -70 05.01.03 1:00:00
1 -15 05.01.03 1:15:00
1 -45 05.01.03 2:00:00
1 -360 05.01.03 8:00:00
1 -720 05.01.03 20:00:00
1 -70 05.01.03 21:10:00
1 -10 05.01.03 21:20:00
1 -45 05.01.03 22:05:00
DateTime как конец операции поэтому нужно в соответствии каждому DateTime время затраченное на операцию
21 окт 04, 15:32    [1052037]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить