Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.53 MB
Время: 0.051 c
6-1113884655
boalse
2005-04-19 08:24
2005.07.31
Имитация сети на одной машине


1-1121248786
Kray
2005-07-13 13:59
2005.07.31
Менеджер проектов


14-1120931664
Piter
2005-07-09 21:54
2005.07.31
RTTI?


3-1118915455
А
2005-06-16 13:50
2005.07.31
ClientDataSet


3-1119601614
Валерий
2005-06-24 12:26
2005.07.31
DBGrid - полный, а DBListBox - пустой