Текущий архив: 2005.07.31;
Скачать: CL | DM;
Внизпрошу помощи составить запрос Найти похожие ветки
← →
stud © (2005-06-23 15:54) [0]есть таблица, в которой регистрируются определенные события
необходимо сделать выборку по времени до 15:00. с 15:00 до 23:00 и с 23:00 до 8:00
с первыми двумя интервалами проблем нет, но вот с третьим??? тут происходит переход через сутки.
возможно ли такое?
← →
Ega23 © (2005-06-23 15:56) [1]используй datetime
← →
stud © (2005-06-23 15:57) [2]и что это даст по сравнению с дата и время?
← →
evvcom © (2005-06-23 15:57) [3]Возможно. Выложи, что у тебя получилось, а мы поправим.
← →
stud © (2005-06-23 16:00) [4]на первые да интервала запросы вида
for execute statement "SELECT trandate,count(*) FROM " ||tn||
" WHERE trantime between "||"""15:00:01"""||" and "||"""23:00"""||
" group by trandate order by trandate" into :trandate_,:po15
tn - это имя таблицы, на каждый месяц своя таблица.
проблема аерехода через месяц не рассматривается!
← →
Ega23 © (2005-06-23 16:00) [5]
TDateTime is a used by the date and time routines to hold date and time values.
Unit
System
type TDateTime = type Double;
Description
Most VCL objects represent date and time values using the TDateTime type. The integral part of a TDateTime value is the number of days that have passed since 12/30/1899. The fractional part of a TDateTime value is fraction of a 24 hour day that has elapsed.
Following are some examples of TDateTime values and their corresponding dates and times:
0 12/30/1899 12:00 am
2.75 1/1/1900 6:00 pm
-1.25 12/29/1899 6:00 am
35065 1/1/1996 12:00 am
To find the fractional number of days between two dates, simply subtract the two values. Likewise, to increment a date and time value by a certain fractional number of days, simply add the fractional number to the date and time value.
Note: Delphi 1.0 calculated the date from year 1 instead of from 1899. To convert a Delphi 1.0 date to a Delphi 2.0 date, subtract 693594.0 from the Delphi 1.0 date. The date format changed to be more compatible with OLE 2.0 Automation.
В большинстве СУБД (если не во всех) этот тип поддерживается.
← →
stud © (2005-06-23 16:02) [6]разумеется. но как это поможет решить проблему??
сейчас в базе два поля дата и время.
забыл сказать СУБД- ФБ 1,5
← →
stud © (2005-06-23 16:03) [7]навскидку по третьему интервалу что-то такого типа
for execute statement "SELECT trandate,count(*) FROM " ||tn||
" WHERE ((trantime>="||"""23:00:01"""||" and "||" trandate=trandate) "||
" and (trantime<="||"""7:59:59"""||" and trandate=trandate+1))"||
" group by trandate order by trandate" into :trandate_,:po23
do suspend;
но не работает (а должно ли?)
← →
Johnmen © (2005-06-23 16:06) [8]>stud ©
Используй EXTRACT.
← →
Ega23 © (2005-06-23 16:06) [9]сейчас в базе два поля дата и время.
А привести их к datetime никак?
← →
stud © (2005-06-23 16:07) [10]
> А привести их к datetime никак?
зачем?????? чем это упрощает задачу?
← →
stud © (2005-06-23 16:10) [11]вот вроде вариант, не лучший наверное но
for execute statement "SELECT distinct trandate FROM " ||tn||" into :t_date do "||
"for select trandate, count(*) from "||tn||
" WHERE ((trantime>="||"""23:00:01"""||" and "||" trandate=t_date) "||
" and (trantime<="||"""7:59:59"""||" and trandate=t_date+1))"||
" group by trandate order by trandate" into :trandate_,:po23
do suspend;
пока не работает...
← →
Sergey13 © (2005-06-23 16:20) [12]2[11] stud © (23.06.05 16:10)
Если тебе дата пофиг, то почему бы не так (скелет, как идея)
select * from table
where time<"8.00" or time>"23.00"
← →
stud © (2005-06-23 16:23) [13]
> Если тебе дата пофиг
дата не пофиг, с чего вы решили?
по ней сумой идет группировка! нужно знать количество операций по дням и по времени в течение дня
← →
stud © (2005-06-23 16:24) [14]
> for execute statement "SELECT distinct trandate FROM "
>||tn||" into :t_date do "||
> "for select trandate, count(*) from "||tn||
ругается вот на этот into
← →
evvcom © (2005-06-23 16:24) [15]А зачем тебе trandate? Изначально в вопросе этого не звучало. используй только trantime. И еще, используй вместо "23:00:01" параметр, иначе нарвешься рано или поздно на ошибку, связанную с региональными настройками.
← →
stud © (2005-06-23 16:26) [16]
> А зачем тебе trandate?
это и есть дата события
> И еще, используй вместо "23:00:01"
хотя бы так сделать))
← →
Sergey13 © (2005-06-23 16:28) [17]2[13] stud © (23.06.05 16:23)
> дата не пофиг, с чего вы решили?
Да так, показалось. 8-)
Я бы наверное вообще добавил поле нечто вроде "Интервал". В таких делах (при переходе периода) вообще многое зависит от способа интерпретации.
← →
Sergey13 © (2005-06-23 16:30) [18]В догонку. Мой "Интервал" это поле ссылка на таблицу интервалов.
← →
TQuery (2005-06-23 16:30) [19]Разбей 23:00 до 8:00
на 23:00 - 24:00 и 00:00 - 08:00
Сделай два запроса (у четом даты), а потом результаты "просуммируй"
← →
Zacho © (2005-06-23 16:34) [20]stud © (23.06.05 15:54)
возможно ли такое?
Да, как уже намекнул Ega23 используй тип полей TIMESTAMP.
Например,SELECT * FROM MY_FIELD
WHERE MY_TIMESTAMP_FIELD BETWEEN :timestamp_1 AND :timestamp_2
stud © (23.06.05 16:02) [6]
сейчас в базе два поля дата и время.
Можно и так, только запрос будет немного сложней.SELECT * FROM MY_FIELD
WHERE (MY_DATE_FIELD BETWEEN :date_1 AND :date_2) AND (MY_TIME_FIELD BETWEEN :time_1 AND :time_2)
stud © (23.06.05 16:03) [7]
Бред какой-то :) Что именно ты хотел сделать ?
И забудь пока про EXECUTE STATEMENT и агрегаты, попробуй без них, заодно и нам проще отвечать будет :)
← →
stud © (2005-06-23 16:34) [21]вот пытаюсь "добить" этот запрос
for execute statement "SELECT distinct trandate FROM " ||tn into :t_date do
begin
for execute statement
" select trandate, count(*) from "||tn||
" WHERE ((trantime between "||"""23:00:01"""||" and "||"""23:59:59"""||" and trandate="||cast(:t_date as varchar (10))||") "||
" or (trantime between "||"""7:59:59"""||" and "||"""7:59:59"""||" and trandate="||cast(:t_date+1 as varchar (10))||")"||
" group by trandate order by trandate" into :trandate_,:po23
do suspend;
end
← →
Zacho © (2005-06-23 16:38) [22]stud © (23.06.05 16:34) [21]
" WHERE ((trantime between "||"""23:00:01"""||" and "||"""23:59:59"""||" and trandate="||cast(:t_date as varchar (10))||") "||
" or (trantime between "||"""7:59:59"""||" and "||"""7:59:59"""||" and trandate="||cast(:t_date+1 as varchar (10))||")"||
Зачем такие извращения ???
← →
stud © (2005-06-23 16:45) [23]смысл запроса - таблица содержит данные за месяц и нужно вывести количество событий по дням и каждый день разбить на интервалы.
← →
evvcom © (2005-06-23 16:47) [24]
> это и есть дата события
Можно пальцем ткнуть, где в вопросе сказано что-нибудь про дату?
← →
Zacho © (2005-06-23 16:52) [25]Мой тебе совет: во-первых, для начала напиши всё это без execute statement и ХП. Гораздо легче и тебе, и нам, будет понять что именно тебе нужно и в чём именно утебя проблема.
Во-втрых: не стоит делать "таблицу на каждый месяц", хотя к твоей проблемке это и не относится.
← →
stud © (2005-06-23 16:57) [26]
> не стоит делать "таблицу на каждый месяц", хотя к
> твоей проблемке это и не относится.
это не мне нужно говорить а разработчикам системы контроля доступа)))
← →
stud © (2005-06-23 17:03) [27]есть таблица:
"дата" "время"
на каждый месяц отдельная таблица.
каждая запись - это событие т.е. когда оно произошло и во сколько.
необходимо получить выборку вида :
дата с_8до_15 с_15_до_23 с_23_до_8
01,01,01 5 10 15
02,01,01 1 9 20
......
т.е. для столбца с_23_До_8 происходит смена даты вот в этой смене и загвоздка. данные с 00:00 до 8:00 2 числа должны отображать 1 числа и т.д.
Страницы: 1 вся ветка
Текущий архив: 2005.07.31;
Скачать: CL | DM;
Память: 0.51 MB
Время: 0.043 c