Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2004.04.11;
Скачать: [xml.tar.bz2];

Вниз

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

 
Sens ©   (2004-04-13 08:34) [0]

Помогите!!! Работаю над программой отчетов по электронным проходным, не знаю как сделать учет рабочего времени за день (хотябы за день). Когда человек проходит через проходные в базе регистрируется его номер направление и время прохода,  за день таких регистраций может быть очень много (если например человек бегает по вызовам), а мне нужно получить сумму времени, которую человек провел в центральном здании, или хотябы время между первой (входной) и последней  (выходной) регистрацией человека. Пока не знаю как запрос организовать, и при этом, чтобы он выполнялся быстро. Если есть идеи - помогите.


 
Sens ©   (2004-04-13 08:34) [0]

Помогите!!! Работаю над программой отчетов по электронным проходным, не знаю как сделать учет рабочего времени за день (хотябы за день). Когда человек проходит через проходные в базе регистрируется его номер направление и время прохода,  за день таких регистраций может быть очень много (если например человек бегает по вызовам), а мне нужно получить сумму времени, которую человек провел в центральном здании, или хотябы время между первой (входной) и последней  (выходной) регистрацией человека. Пока не знаю как запрос организовать, и при этом, чтобы он выполнялся быстро. Если есть идеи - помогите.


 
ЮЮ ©   (2004-04-13 08:45) [1]

>и при этом, чтобы он выполнялся быстро

Для этого каждая запись "выхода" должна ОЗНОЗНАЧНО соответствовать записи на "вход". Тогда, соединив через JOIN, получим пары вход-выход. Естественно, лучше организовать на уровне структуры данных


 
ЮЮ ©   (2004-04-13 08:45) [1]

>и при этом, чтобы он выполнялся быстро

Для этого каждая запись "выхода" должна ОЗНОЗНАЧНО соответствовать записи на "вход". Тогда, соединив через JOIN, получим пары вход-выход. Естественно, лучше организовать на уровне структуры данных


 
Sergey13 ©   (2004-04-13 08:45) [2]

Вообще, не дурно бы знать как ты хранишь все это добро, но нечто вроде
select max(time_field)-min(time_field) FROM Table1
where....
даст тебе разницу.


 
Sergey13 ©   (2004-04-13 08:45) [2]

Вообще, не дурно бы знать как ты хранишь все это добро, но нечто вроде
select max(time_field)-min(time_field) FROM Table1
where....
даст тебе разницу.


 
Anatoly Podgoretsky ©   (2004-04-13 08:52) [3]

ЮЮ ©   (13.04.04 08:45) [1]
В реальности для проходных такое точное соответствие не всегда бывает. А второй вариант первой (входной) и последней  (выходной) вообще бессмысленный - вошел 2.01.2001, выше 13.04.2004. Какой то смысл появляется если применить формулу последней входной и последней выходной, предпоследней входной и предпоследней выходной и так далее.
Несложно организуется проходом по двум наборам данным - входа и выхода.


 
Anatoly Podgoretsky ©   (2004-04-13 08:52) [3]

ЮЮ ©   (13.04.04 08:45) [1]
В реальности для проходных такое точное соответствие не всегда бывает. А второй вариант первой (входной) и последней  (выходной) вообще бессмысленный - вошел 2.01.2001, выше 13.04.2004. Какой то смысл появляется если применить формулу последней входной и последней выходной, предпоследней входной и предпоследней выходной и так далее.
Несложно организуется проходом по двум наборам данным - входа и выхода.


 
sniknik ©   (2004-04-13 08:57) [4]

может и получится
select sum(Case номер направление when 0 then -1 else 1 end * время прохода) FROM Table1

(вариацию с приведением типа лутше сделать, это только идея) ну и подумать на тему если чел в ночную работает, сегодня пришол завтра ушол (через дырку в заборе ;о)) а данные по дню групируются...


 
sniknik ©   (2004-04-13 08:57) [4]

может и получится
select sum(Case номер направление when 0 then -1 else 1 end * время прохода) FROM Table1

(вариацию с приведением типа лутше сделать, это только идея) ну и подумать на тему если чел в ночную работает, сегодня пришол завтра ушол (через дырку в заборе ;о)) а данные по дню групируются...


 
Sergey13 ©   (2004-04-13 09:04) [5]

2Anatoly Podgoretsky ©   (13.04.04 08:52) [3]
"Та заводская проходная, что в люди вывела меня", написанная мной на Клиппере, крутится уже 12 лет. Не далее как час назад "пробился" на входе. Там очень дофига "если бы да кабы", но именно поэтому я и написал "нечто вроде". У меня например сначала идет проверка на "парность" вход/выход. Далее эти записи (нарушители проходного режима) в расчете не учавствуют, точнее по ним расчитывается время нарушения (тоже кстати с большими допущениями из-за неопределенностей).


 
Sergey13 ©   (2004-04-13 09:04) [5]

2Anatoly Podgoretsky ©   (13.04.04 08:52) [3]
"Та заводская проходная, что в люди вывела меня", написанная мной на Клиппере, крутится уже 12 лет. Не далее как час назад "пробился" на входе. Там очень дофига "если бы да кабы", но именно поэтому я и написал "нечто вроде". У меня например сначала идет проверка на "парность" вход/выход. Далее эти записи (нарушители проходного режима) в расчете не учавствуют, точнее по ним расчитывается время нарушения (тоже кстати с большими допущениями из-за неопределенностей).


 
Sens ©   (2004-04-13 09:15) [6]

==========================================================
1     2   3   4   5   6           7
1144 | 1 | 1 | 1 | 0 | 0 | 2003-10-22 07:15:00 - пришел на работу
1144 | 1 | 1 | 0 | 0 | 0 | 2003-10-22 12:02:45 - обед выход
1144 | 1 | 1 | 1 | 0 | 0 | 2003-10-22 12:56:17 - обед вход
1144 | 1 | 1 | 0 | 0 | 0 | 2003-10-22 17:02:51 - ушел с работы
==========================================================

1 colAccountNumber  - ключ, номер человека
2 colCardholder
3 colPointNumber  
4 colDirection - направление прохода
5 colZoneTarget - куда вышел
6 colStatusNumber - статус (разрешен ли доступ или отказано по какой-то причине)
7 colRegistrationTime - время регистрации

Проблема какраз состоит в том, чтобы выбрать 1-ю и последнюю запись. Понятно что можно вызвать запрос, со всеми тегистрациями, взять прервую запись и последнюю запись в из результата, это получится  время прихода и ухода, а как выкинуть время обеда ???


 
Sens ©   (2004-04-13 09:15) [6]

==========================================================
1     2   3   4   5   6           7
1144 | 1 | 1 | 1 | 0 | 0 | 2003-10-22 07:15:00 - пришел на работу
1144 | 1 | 1 | 0 | 0 | 0 | 2003-10-22 12:02:45 - обед выход
1144 | 1 | 1 | 1 | 0 | 0 | 2003-10-22 12:56:17 - обед вход
1144 | 1 | 1 | 0 | 0 | 0 | 2003-10-22 17:02:51 - ушел с работы
==========================================================

1 colAccountNumber  - ключ, номер человека
2 colCardholder
3 colPointNumber  
4 colDirection - направление прохода
5 colZoneTarget - куда вышел
6 colStatusNumber - статус (разрешен ли доступ или отказано по какой-то причине)
7 colRegistrationTime - время регистрации

Проблема какраз состоит в том, чтобы выбрать 1-ю и последнюю запись. Понятно что можно вызвать запрос, со всеми тегистрациями, взять прервую запись и последнюю запись в из результата, это получится  время прихода и ухода, а как выкинуть время обеда ???


 
Sergey13 ©   (2004-04-13 09:31) [7]

ИМХО, "стандартными" запросами тут не пройдет. Надо писать программу - логика там больно неопределенная, вернее условий сильно много (например чел в отпуске и зашел на полчаса деньги получить). А в таблице с проходами можно выставлять флажок - запись уже обработана да/нет.


 
Sergey13 ©   (2004-04-13 09:31) [7]

ИМХО, "стандартными" запросами тут не пройдет. Надо писать программу - логика там больно неопределенная, вернее условий сильно много (например чел в отпуске и зашел на полчаса деньги получить). А в таблице с проходами можно выставлять флажок - запись уже обработана да/нет.


 
Sens ©   (2004-04-13 09:35) [8]

Вот и я о том-же сделать можно, но представите сколько прога быдет все это вычислять для того, чтобы сделать табель выходов на работу за месяц для 1400 человек, если в этой таблице уже почти 900 000 записей...
Вот и написал посоветоваться, одна голова хорошо, а форум лучше :)))

Горе мне - горе...
:))


 
Sens ©   (2004-04-13 09:35) [8]

Вот и я о том-же сделать можно, но представите сколько прога быдет все это вычислять для того, чтобы сделать табель выходов на работу за месяц для 1400 человек, если в этой таблице уже почти 900 000 записей...
Вот и написал посоветоваться, одна голова хорошо, а форум лучше :)))

Горе мне - горе...
:))


 
Sergey13 ©   (2004-04-13 09:46) [9]

2Sens ©   (13.04.04 09:35) [8]
>если в этой таблице уже почти 900 000 записей...
Ну дык, чисти ее. Кому нужен прошлогодний снег? На крайний случай скидывай "месячные итоги" в архивную таблу и чисти оперативную.


 
Sergey13 ©   (2004-04-13 09:46) [9]

2Sens ©   (13.04.04 09:35) [8]
>если в этой таблице уже почти 900 000 записей...
Ну дык, чисти ее. Кому нужен прошлогодний снег? На крайний случай скидывай "месячные итоги" в архивную таблу и чисти оперативную.


 
Nikolay M. ©   (2004-04-13 09:47) [10]

Имхо, не стоит мудрить, пытаясь достать эту сумму одним запросом. Лепил я в целях повышения образованности такие десятиэтажные запросы, где одна таблица джойнилась сама на себя раз 5 + куча CASE-ов. И не факт, что в итоге получится правильно.
Имхо, небольшая хранимая процедурка + курсор на SELECT, в котором данные отсортированы по дате входа/выхода + несколько IF-ов - как раз то, что нужно.


 
Nikolay M. ©   (2004-04-13 09:47) [10]

Имхо, не стоит мудрить, пытаясь достать эту сумму одним запросом. Лепил я в целях повышения образованности такие десятиэтажные запросы, где одна таблица джойнилась сама на себя раз 5 + куча CASE-ов. И не факт, что в итоге получится правильно.
Имхо, небольшая хранимая процедурка + курсор на SELECT, в котором данные отсортированы по дате входа/выхода + несколько IF-ов - как раз то, что нужно.


 
Anatoly Podgoretsky ©   (2004-04-13 09:54) [11]

Ты учитывай и непарность
IN,OUT,IN,IN,IN,OUT,IN,OUT,OUT,IN
И переход через сутки, месяц, а у тебя еше и тип входв/выхода, может оказаться - обед выход, пришел на работу
Различные графики работы, логика может оказаться очень сложной, придется применять ИИ, а то у тебя очень такая красивая табличка :-)

Что такое 900 000 записей, мелочь, работать то наверняка будешь с интервалом дат и логику делать на клиенте.

Order by klient, date


 
Anatoly Podgoretsky ©   (2004-04-13 09:54) [11]

Ты учитывай и непарность
IN,OUT,IN,IN,IN,OUT,IN,OUT,OUT,IN
И переход через сутки, месяц, а у тебя еше и тип входв/выхода, может оказаться - обед выход, пришел на работу
Различные графики работы, логика может оказаться очень сложной, придется применять ИИ, а то у тебя очень такая красивая табличка :-)

Что такое 900 000 записей, мелочь, работать то наверняка будешь с интервалом дат и логику делать на клиенте.

Order by klient, date


 
Nikolay M. ©   (2004-04-13 10:14) [12]


> логику делать на клиенте.

на фига??? По шее потом получить?


 
Nikolay M. ©   (2004-04-13 10:14) [12]


> логику делать на клиенте.

на фига??? По шее потом получить?


 
Anatoly Podgoretsky ©   (2004-04-13 10:16) [13]

Не дело сервера заниматься логическими вычислениями.


 
Anatoly Podgoretsky ©   (2004-04-13 10:16) [13]

Не дело сервера заниматься логическими вычислениями.


 
Nikolay M. ©   (2004-04-13 10:20) [14]

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


 
Nikolay M. ©   (2004-04-13 10:20) [14]

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


 
Sens ©   (2004-04-13 10:28) [15]

2 Anatoly Podgoretsky
Да, логика будет сложная, но я пока планирую сделать не много... учет за день, а потом вывести в отчет дни за месяц, повыбрасывав из них выходные и праздничные дни (это и будет табель выходов на работу). У наших расчетчиков учитываются отработанные часы/мес.

Последую примеру и буду логику делать на клиенте.

Спасибо Всем за идеи. ;)


 
Sens ©   (2004-04-13 10:28) [15]

2 Anatoly Podgoretsky
Да, логика будет сложная, но я пока планирую сделать не много... учет за день, а потом вывести в отчет дни за месяц, повыбрасывав из них выходные и праздничные дни (это и будет табель выходов на работу). У наших расчетчиков учитываются отработанные часы/мес.

Последую примеру и буду логику делать на клиенте.

Спасибо Всем за идеи. ;)


 
Sergey13 ©   (2004-04-13 10:40) [16]

2Sens ©   (13.04.04 10:28) [15]
>но я пока планирую сделать не много
Так, скорее всего не получится. Или все или ничего. Прикинь, чела вызвали в военкомат, например. Это ГО (гособязанность)-оплата 100%. Больничные, отгулы (с документальным подтверждением), уходы по производственным делам и т.д. и т.п. Без таких вещей твой табель нужен только в туалете, если конечно бумага мягкая. 8-)
А кроме всего прочего (у нас железо самой проходной доисторическое), бывает что данных просто нет в принципе. Зимой замерзло, летом вспотело. 8-) А люди то ходят, и что самое удивительное - некоторые работают.

>У наших расчетчиков учитываются отработанные часы/мес.
Добавь сразу возможность ручной корректировки результатов, 8-) иначе... 8-(


 
Sergey13 ©   (2004-04-13 10:40) [16]

2Sens ©   (13.04.04 10:28) [15]
>но я пока планирую сделать не много
Так, скорее всего не получится. Или все или ничего. Прикинь, чела вызвали в военкомат, например. Это ГО (гособязанность)-оплата 100%. Больничные, отгулы (с документальным подтверждением), уходы по производственным делам и т.д. и т.п. Без таких вещей твой табель нужен только в туалете, если конечно бумага мягкая. 8-)
А кроме всего прочего (у нас железо самой проходной доисторическое), бывает что данных просто нет в принципе. Зимой замерзло, летом вспотело. 8-) А люди то ходят, и что самое удивительное - некоторые работают.

>У наших расчетчиков учитываются отработанные часы/мес.
Добавь сразу возможность ручной корректировки результатов, 8-) иначе... 8-(


 
Anatoly Podgoretsky ©   (2004-04-13 10:44) [17]

Nikolay M. ©   (13.04.04 10:20) [14]
Какие многоэтажные запросы, просто bwtween d1 and d2, индексы будут учитываться, по его данным это примерно 6000 записей на месяц.


 
Anatoly Podgoretsky ©   (2004-04-13 10:44) [17]

Nikolay M. ©   (13.04.04 10:20) [14]
Какие многоэтажные запросы, просто bwtween d1 and d2, индексы будут учитываться, по его данным это примерно 6000 записей на месяц.


 
Ega23 ©   (2004-04-13 10:53) [18]

Anatoly Podgoretsky ©   (13.04.04 10:44) [17]

Если не 5000 человек на предприятии

Кстати, не забывайте и такой факт:
допустим нужно получить табель сотрудников за вчера. А кто-то в ночную смену работал. Т.е. первое событие за этот день в системе у него - ВЫХОД.


 
Ega23 ©   (2004-04-13 10:53) [18]

Anatoly Podgoretsky ©   (13.04.04 10:44) [17]

Если не 5000 человек на предприятии

Кстати, не забывайте и такой факт:
допустим нужно получить табель сотрудников за вчера. А кто-то в ночную смену работал. Т.е. первое событие за этот день в системе у него - ВЫХОД.


 
Johnmen ©   (2004-04-13 10:54) [19]

>Sens ©

Можно запросом :
SELECT
 colAccountNumber,
 SUM(datetimediff)
FROM
(SELECT
  T1.colAccountNumber,
  MIN(CAST(T2.colRegistrationTime-T1.colRegistrationTime AS FLOAT)) AS datetimediff
FROM Table T1
JOIN Table T2 ON (T2.colAccountNumber=T1.colAccountNumber) AND
                 (T1.colZoneTarget=1) AND (T2.colZoneTarget=0) AND
                  (T1.colRegistrationTime<=T2.colRegistrationTime)
GROUP BY T1.colAccountNumber, T1.colRegistrationTime
) AS T
GROUP BY colAccountNumber


 
Johnmen ©   (2004-04-13 10:54) [19]

>Sens ©

Можно запросом :
SELECT
 colAccountNumber,
 SUM(datetimediff)
FROM
(SELECT
  T1.colAccountNumber,
  MIN(CAST(T2.colRegistrationTime-T1.colRegistrationTime AS FLOAT)) AS datetimediff
FROM Table T1
JOIN Table T2 ON (T2.colAccountNumber=T1.colAccountNumber) AND
                 (T1.colZoneTarget=1) AND (T2.colZoneTarget=0) AND
                  (T1.colRegistrationTime<=T2.colRegistrationTime)
GROUP BY T1.colAccountNumber, T1.colRegistrationTime
) AS T
GROUP BY colAccountNumber


 
sniknik ©   (2004-04-13 10:59) [20]

проверил (правда в access) идею в [4] по данным в Sens ©   (13.04.04 09:15) [6]
(просто для примера)
ничего, работает
SELECT CDate(SUM(iif(client_id =1,-1,1)*servicedate)) FROM Table2
результат
30.12.1899 8:54:19
ну 30.12.1899 это ноль, а время на работе -> 8:54:19, кстати переработка!! ;о)
(таблицу взял первую попавшуюся, т.е. названия полей мои)


 
sniknik ©   (2004-04-13 10:59) [20]

проверил (правда в access) идею в [4] по данным в Sens ©   (13.04.04 09:15) [6]
(просто для примера)
ничего, работает
SELECT CDate(SUM(iif(client_id =1,-1,1)*servicedate)) FROM Table2
результат
30.12.1899 8:54:19
ну 30.12.1899 это ноль, а время на работе -> 8:54:19, кстати переработка!! ;о)
(таблицу взял первую попавшуюся, т.е. названия полей мои)


 
Delirium ©   (2004-04-13 11:04) [21]

Ещё вариант быстрого совмещения времен, поле A - вход/выход, поле B - время, на поле С во временной таблице рекомендую наложить кластерный индекс

select *,
Identity(int, 1, 1) as C
into #t
from t
order by B

select *
from #t t1
join #t t0 on t1.C=t0.C-1
where (t1.A=1) and (t0.A=0)


 
Delirium ©   (2004-04-13 11:04) [21]

Ещё вариант быстрого совмещения времен, поле A - вход/выход, поле B - время, на поле С во временной таблице рекомендую наложить кластерный индекс

select *,
Identity(int, 1, 1) as C
into #t
from t
order by B

select *
from #t t1
join #t t0 on t1.C=t0.C-1
where (t1.A=1) and (t0.A=0)


 
Delirium ©   (2004-04-13 11:12) [22]

Кстати, потестировав, могу сказать, что вышеозначеный индекс на больших объёмах даёт выигрыш более чем в 60 раз.

create unique clustered index #ix on #t (C asc)


 
Delirium ©   (2004-04-13 11:12) [22]

Кстати, потестировав, могу сказать, что вышеозначеный индекс на больших объёмах даёт выигрыш более чем в 60 раз.

create unique clustered index #ix on #t (C asc)


 
Anatoly Podgoretsky ©   (2004-04-13 11:28) [23]

Ega23 ©   (13.04.04 10:53) [18]
Не забываю, день минус 1 и анализ на отсутствия выхода (с временем более последнего входа) в этот день. Там уже варианты относить в предудущему месяцу, к текущему или разбить по обеим месяцам пропорционально. Другой вариант, входа нет, считать за первое число и время 0.


 
Anatoly Podgoretsky ©   (2004-04-13 11:28) [23]

Ega23 ©   (13.04.04 10:53) [18]
Не забываю, день минус 1 и анализ на отсутствия выхода (с временем более последнего входа) в этот день. Там уже варианты относить в предудущему месяцу, к текущему или разбить по обеим месяцам пропорционально. Другой вариант, входа нет, считать за первое число и время 0.


 
Sens ©   (2004-04-13 11:45) [24]

2 sniknik
Подправь пожалуйста, где-то я проглючил

SELECT CDate(SUM(iif(tblAllRegistrations.colAccountNumber =1144,-1,1)*colRegistrationTime)) FROM dbo.tblAllRegistrations
-------------------------------------------
Server: Msg 170, Level 15, State 1, Line 1
Line 1: Incorrect syntax near "=".
-------------------------------------------


 
Sens ©   (2004-04-13 11:45) [24]

2 sniknik
Подправь пожалуйста, где-то я проглючил

SELECT CDate(SUM(iif(tblAllRegistrations.colAccountNumber =1144,-1,1)*colRegistrationTime)) FROM dbo.tblAllRegistrations
-------------------------------------------
Server: Msg 170, Level 15, State 1, Line 1
Line 1: Incorrect syntax near "=".
-------------------------------------------


 
Delirium ©   (2004-04-13 11:48) [25]

MSSQL не знает что такое iif


 
Delirium ©   (2004-04-13 11:48) [25]

MSSQL не знает что такое iif


 
sniknik ©   (2004-04-13 11:49) [26]

Sens ©   (13.04.04 11:45) [24]
это для аксеса, для mssql будет по другому (первый вариант что приводил), счас проверю точнее (может там вообще не пойдет (не верю ;о)).


 
sniknik ©   (2004-04-13 11:49) [26]

Sens ©   (13.04.04 11:45) [24]
это для аксеса, для mssql будет по другому (первый вариант что приводил), счас проверю точнее (может там вообще не пойдет (не верю ;о)).


 
sniknik ©   (2004-04-13 12:02) [27]

для MSSQL

SELECT
 CAST(SUM(CASE AcNum WHEN  1 THEN -CAST(RegTime AS FLOAT) ELSE CAST(RegTime AS FLOAT) END) AS DateTime)
FROM Table2


 
sniknik ©   (2004-04-13 12:02) [27]

для MSSQL

SELECT
 CAST(SUM(CASE AcNum WHEN  1 THEN -CAST(RegTime AS FLOAT) ELSE CAST(RegTime AS FLOAT) END) AS DateTime)
FROM Table2


 
sniknik ©   (2004-04-13 12:06) [28]

да 1 у меня это похоже 1144 у тебя, и дата будет
01.01.1900 8:54:19
вместо
30.12.1899 8:54:19
но это все одно ноль ;о))


 
sniknik ©   (2004-04-13 12:06) [28]

да 1 у меня это похоже 1144 у тебя, и дата будет
01.01.1900 8:54:19
вместо
30.12.1899 8:54:19
но это все одно ноль ;о))


 
Sens ©   (2004-04-13 12:23) [29]

Что-то у меня опять не как у людей 8-(
Или я тупой или лыжи не едут!

SELECT
CAST(SUM(CASE dbo.tblAllRegistrations.colAccountNumber
WHEN  1144
THEN -CAST(dbo.tblAllRegistrations.colRegistrationTime AS FLOAT)
ELSE CAST(dbo.tblAllRegistrations.colRegistrationTime AS FLOAT) END) AS DateTime)

FROM dbo.tblAllRegistrations
Where
dbo.tblAllRegistrations.colRegistrationTime between "01.03.2004" AND "02.03.2004"

============================================================
Server: Msg 8115, Level 16, State 2, Line 1
Arithmetic overflow error converting expression to data type datetime.
=============================================================


 
Sens ©   (2004-04-13 12:23) [29]

Что-то у меня опять не как у людей 8-(
Или я тупой или лыжи не едут!

SELECT
CAST(SUM(CASE dbo.tblAllRegistrations.colAccountNumber
WHEN  1144
THEN -CAST(dbo.tblAllRegistrations.colRegistrationTime AS FLOAT)
ELSE CAST(dbo.tblAllRegistrations.colRegistrationTime AS FLOAT) END) AS DateTime)

FROM dbo.tblAllRegistrations
Where
dbo.tblAllRegistrations.colRegistrationTime between "01.03.2004" AND "02.03.2004"

============================================================
Server: Msg 8115, Level 16, State 2, Line 1
Arithmetic overflow error converting expression to data type datetime.
=============================================================


 
Sens ©   (2004-04-13 12:29) [30]

sniknik ©   (13.04.04 12:06) [28]

Хотя принцип ясен, думаю разберусь. Спасибо.


 
Sens ©   (2004-04-13 12:29) [30]

sniknik ©   (13.04.04 12:06) [28]

Хотя принцип ясен, думаю разберусь. Спасибо.


 
Johnmen ©   (2004-04-13 12:35) [31]

А чем не устроил [19] ?


 
Johnmen ©   (2004-04-13 12:35) [31]

А чем не устроил [19] ?


 
Sens ©   (2004-04-13 12:44) [32]

2 Johnmen ©   (13.04.04 12:35) [31]

Пробовал, но у меня что-то страшное получилось.  Не могу понять, как можно таблицу саму с собой связать.

SELECT
colAccountNumber,
SUM(datetimediff)
FROM
(SELECT
 dbo.tblAllRegistrations.colAccountNumber,
 MIN(CAST(dbo.tblAllRegistrations.colRegistrationTime-dbo.tblAllRegistrations.colRegistrationTime AS FLOAT)) AS datetimediff
FROM Table dbo.tblAllRegistrations
JOIN Table dbo.tblAllRegistrations ON (dbo.tblAllRegistrations.colAccountNumber=dbo.tblAllRegistrations.colAccountNumber) AND
                (dbo.tblAllRegistrations.colZoneTarget=1) AND (dbo.tblAllRegistrations.colZoneTarget=0) AND
                 (dbo.tblAllRegistrations.colRegistrationTime<=dbo.tblAllRegistrations.colRegistrationTime)
GROUP BY dbo.tblAllRegistrations.colAccountNumber, dbo.tblAllRegistrations.colRegistrationTime
) AS T
GROUP BY dbo.tblAllRegistrations.colAccountNumber


 
Sens ©   (2004-04-13 12:44) [32]

2 Johnmen ©   (13.04.04 12:35) [31]

Пробовал, но у меня что-то страшное получилось.  Не могу понять, как можно таблицу саму с собой связать.

SELECT
colAccountNumber,
SUM(datetimediff)
FROM
(SELECT
 dbo.tblAllRegistrations.colAccountNumber,
 MIN(CAST(dbo.tblAllRegistrations.colRegistrationTime-dbo.tblAllRegistrations.colRegistrationTime AS FLOAT)) AS datetimediff
FROM Table dbo.tblAllRegistrations
JOIN Table dbo.tblAllRegistrations ON (dbo.tblAllRegistrations.colAccountNumber=dbo.tblAllRegistrations.colAccountNumber) AND
                (dbo.tblAllRegistrations.colZoneTarget=1) AND (dbo.tblAllRegistrations.colZoneTarget=0) AND
                 (dbo.tblAllRegistrations.colRegistrationTime<=dbo.tblAllRegistrations.colRegistrationTime)
GROUP BY dbo.tblAllRegistrations.colAccountNumber, dbo.tblAllRegistrations.colRegistrationTime
) AS T
GROUP BY dbo.tblAllRegistrations.colAccountNumber


 
Sens ©   (2004-04-13 12:45) [33]

2 Johnmen ©   (13.04.04 12:35) [31]

как результат:
===================================
Server: Msg 156, Level 15, State 1, Line 8
Incorrect syntax near the keyword "Table".
===================================


 
Sens ©   (2004-04-13 12:45) [33]

2 Johnmen ©   (13.04.04 12:35) [31]

как результат:
===================================
Server: Msg 156, Level 15, State 1, Line 8
Incorrect syntax near the keyword "Table".
===================================


 
sniknik ©   (2004-04-13 12:46) [34]

> Arithmetic overflow error converting expression to data type datetime.
попробуй не к float а к real приводить. унего разрядность больше.


 
sniknik ©   (2004-04-13 12:46) [34]

> Arithmetic overflow error converting expression to data type datetime.
попробуй не к float а к real приводить. унего разрядность больше.


 
Johnmen ©   (2004-04-13 12:48) [35]

Table в примере - это твоя таблица...
:)


 
Johnmen ©   (2004-04-13 12:48) [35]

Table в примере - это твоя таблица...
:)


 
Sens ©   (2004-04-13 12:51) [36]

Johnmen ©   (13.04.04 12:48) [35]

Так правильнее... оказывается у меня по асфальту лыжи не едут...
:)))

SELECT
 colAccountNumber,
SUM(datetimediff)
FROM
(SELECT
 T1.colAccountNumber,
 MIN(CAST(T2.colRegistrationTime-T1.colRegistrationTime AS FLOAT)) AS datetimediff
FROM dbo.tblAllRegistrations T1
JOIN dbo.tblAllRegistrations T2 ON (T2.colAccountNumber=T1.colAccountNumber) AND
                (T1.colZoneTarget=1) AND (T2.colZoneTarget=0) AND
                 (T1.colRegistrationTime<=T2.colRegistrationTime)
GROUP BY T1.colAccountNumber, T1.colRegistrationTime
) AS T
GROUP BY colAccountNumber


 
Sens ©   (2004-04-13 12:51) [36]

Johnmen ©   (13.04.04 12:48) [35]

Так правильнее... оказывается у меня по асфальту лыжи не едут...
:)))

SELECT
 colAccountNumber,
SUM(datetimediff)
FROM
(SELECT
 T1.colAccountNumber,
 MIN(CAST(T2.colRegistrationTime-T1.colRegistrationTime AS FLOAT)) AS datetimediff
FROM dbo.tblAllRegistrations T1
JOIN dbo.tblAllRegistrations T2 ON (T2.colAccountNumber=T1.colAccountNumber) AND
                (T1.colZoneTarget=1) AND (T2.colZoneTarget=0) AND
                 (T1.colRegistrationTime<=T2.colRegistrationTime)
GROUP BY T1.colAccountNumber, T1.colRegistrationTime
) AS T
GROUP BY colAccountNumber


 
sniknik ©   (2004-04-13 12:54) [37]

> Arithmetic overflow error converting expression to data type datetime.
кстати возможно не к тому преобразованию относится где float а к
between "01.03.2004" AND "02.03.2004"
этому
задавай параметрами, в крайнеи случае так
between "20040201" AND "20040302"


 
sniknik ©   (2004-04-13 12:54) [37]

> Arithmetic overflow error converting expression to data type datetime.
кстати возможно не к тому преобразованию относится где float а к
between "01.03.2004" AND "02.03.2004"
этому
задавай параметрами, в крайнеи случае так
between "20040201" AND "20040302"



Страницы: 1 вся ветка

Форум: "Базы";
Текущий архив: 2004.04.11;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.67 MB
Время: 0.039 c
1-1082388392
Тимохов
2004-04-19 19:26
2004.05.09
Thread.Terminated II.


3-1081744611
Bizon
2004-04-12 08:36
2004.05.09
Checkbox в DBGride


1-1082356834
_новый_
2004-04-19 10:40
2004.05.09
TSaveDialog


14-1081750703
31512
2004-04-12 10:18
2004.05.09
WinXP и Win98 - нет дружбы по сети?


14-1081916684
SPeller
2004-04-14 08:24
2004.05.09
Прикольчик :)





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский