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

Вниз

прошу помощи составить запрос   Найти похожие ветки 

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.034 c
1-1121012297
atruhin
2005-07-10 20:18
2005.07.31
Проблема с управлением очередью печати


14-1120728878
IceBeerg
2005-07-07 13:34
2005.07.31
Антивирус NOD32 кто, что может сказать?


4-1117688968
Strech
2005-06-02 09:09
2005.07.31
Модальные окна


3-1119527686
stud
2005-06-23 15:54
2005.07.31
прошу помощи составить запрос


1-1120999072
B-S-G
2005-07-10 16:37
2005.07.31
Изменить исполняемый файл





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский