![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
SQL запрос [D5, WinME]
Nata © (2004-12-22 18:21:00)Доброго времени суток. Помогите составить запрос . Надо из таблицы J51 ( поля таблицы : dat(дата) и name (наименования)) выбрать все записи за какой-либо месяц ( к примеру за январь 2004 или октябрь2004).
Sergey13 (2004-12-23 11:22:00) [1]2[32] sniknik © (23.12.04 11:16)
Сори. В таком объеме не углядел. Признаю свою ошибку. 8-)
sniknik (2004-12-23 11:16:00) [2]> На пустом месте 30 постов - круто! 8-)
вот и ты отметился, хотя твой ответ повтор того что уже было... ;)
Sergey13 (2004-12-23 09:29:00) [3]На пустом месте 30 постов - круто! 8-)
Варианты с функциями извлечения месяца/года в SQL запросе приведут, скорее всего, к полному просмотру таблицы, даже при индексированом поле даты. Или нужен индекс по функции. Вариант с
between :d_begin and :d_end
или
where dat >= Начало_месяца and Dat < Начало_следующего
будет использовать обычный индекс.
Так что, мое ИМХО, не все надо пихать в SQL. 8-)
Zacho (2004-12-22 21:58:00) [4]Skyle © (22.12.04 21:29) [29]
<offtop>
Проверь почту.
</offtop>
Skyle (2004-12-22 21:29:00) [5]> Nata © (22.12.04 20:13) [26]
> можно попонятней разъяснить(((
Что именно нуждается в объяснении?
Какой-то конкретный ответ или какое-то телодвижение?
Прошу указать.
<offtop>
> Zacho © (22.12.04 20:24) [27]
Хочу знать твоё решение по нашему общему вопросу.
</offtop>
sniknik (2004-12-22 20:50:00) [6]Ega23 © (22.12.04 19:42) [22]
> проверь правильно
> Да где-ж тут правильно-то... Способов дофига, каждый что-то своё выдаёт:
все провильно...
> select Round(Cast(getdate() as float), 0, 1)
"чистый" день без времени, представлен числом
> select Cast(getdate() as float)
дататайм как число, целое - дата, дробное - время
> select Cast(getdate() as int)
то же представлено числом и округлено (в первой половине дня к меньшему во второй к большему)
и что не так?
сравнивать надо с первым, раз ты пытался сравнение с датой сделать, но с числом в mssql/в delphi, а с параметром переданным в запрос как дата... или ты думаеш ты первый обратил внимание на разницу в точке отчета?
Zacho (2004-12-22 20:24:00) [7]Nata © (22.12.04 20:13) [26]
На будущее: используемый сервер надо сразу указывать в вопросе. И версию сервера тоже.
А по существу: см. Sergey13 © (22.12.04 18:37) [2] или Skyle © (22.12.04 18:40) [3].
Если IB>=6.0 то и Соловьев © (22.12.04 18:42) [5] подойдёт.
Все способы правильные, выбирай по вкусу.
P.S. Весьма полезно будет посетить http://www.ibase.ru/develop.htm
Nata (2004-12-22 20:13:00) [8]ну... я теперь вообще ничего не пойму..(( я новичок.. с SQL впервые столкнулась.. можно попонятней разъяснить(((
я использую interbase.
Skyle (2004-12-22 19:58:00) [9]> Во нафлудили-то...
По мне так это не флуд, а нечто иное...
P.S. прошу простить грамматические ошибки в моём посте [24] :)))
Skyle (2004-12-22 19:50:00) [10]Сорри за тормоза, диалап - смерть..:(((
> Соловьев © (22.12.04 19:17) [14]
Примеры относятся к MS SQL.
Клиенту совсем не нужно знать, что такое 00 часов 01 минута.
Ему нужен интервал в месяц.
И неважно какого года. Есть TDateTimePicker какой-нибудь на форме и это единственное, что заботит клиента. Нужен ему отчёт за месяц с даты XXX и хоть трава не расти.
Пишется запрос, который принимает дату начала, делает DateAdd(m, 1, @StartDate) и далее по тексту.
> Ega23 © (22.12.04 19:17) [15]
> если есть выбор - произвести какое-то действие на клиенте,
> или произвести его в запросе - делаю в запросе.
Действие действию рознь. Зависит от того, где реализуется логика даннойоперации. Так что варианты различны. Иногда имеет смысл обратная ситуация.
> В Delphi результатом showmessage(IntToStr(Trunc(Now)));
> будет 38343, а в MS SQL результатом select Cast(getdate()
> as int) будет 38342.
Мы уже обсуждаем нули? По мне так вопрос был в ином.
Или кому-то могут потребоваться данные в прошлом относительно одного из нулей? Вот тут - соглашусь, но опять же, ноль - понятие относительное %-)
> Остаётся только эту дату вычислить
Если ваша бухгалтерия не знает, какой датой она должна вам дать зарплату, то я только посочуствую..;-))))))
Ega23 (2004-12-22 19:43:00) [11]2 sniknik © (22.12.04 19:37) [21]
> StartOfTheMonth() и EndOfTheMonth() - что за функции?
uses DateUtils + F1
Delphi какой? Семёрка, поди?
Ega23 (2004-12-22 19:42:00) [12]проверь правильно
Да где-ж тут правильно-то... Способов дофига, каждый что-то своё выдаёт:
select Round(Cast(getdate() as float), 0, 1)
select Cast(getdate() as float)
select Cast(getdate() as int)
-----------------------------------------------------
38341.0
(1 row(s) affected)
-----------------------------------------------------
38341.821306597223
(1 row(s) affected)
-----------
38342
(1 row(s) affected)
Да и в справке написано:
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
...........
Values with the datetime data type are stored internally by Microsoft SQL Server as two 4-byte integers. The first 4 bytes store the number of days before or after the base date, January 1, 1900. The base date is the system reference date. Values for datetime earlier than January 1, 1753, are not permitted. The other 4 bytes store the time of day represented as the number of milliseconds after midnight.
sniknik (2004-12-22 19:37:00) [13]> StartOfTheMonth() и EndOfTheMonth() - что за функции?
uses DateUtils + F1
sniknik (2004-12-22 19:33:00) [14]> При чём тут апельсины?
> В Delphi результатом showmessage(IntToStr(Trunc(Now))); будет 38343, а в MS SQL результатом select Cast(getdate() as int) будет 38342.
проверь правильно
select Round(Cast(getdate() as float), 0, 1) , Cast(:dat as int)
:dat:= Trunc(Now)
Ega23 (2004-12-22 19:25:00) [15]Во нафлудили-то...
А автор, как обычно, пропал... :о)
Ega23 (2004-12-22 19:24:00) [16]2 sniknik © (22.12.04 19:11) [12]
зря, если есть по полю индекс то он будет бесполезен.
А вот это уже серьёзный аргумент. Учту на будущее.
Соловьев (2004-12-22 19:23:00) [17]хотя с точки зрения быстродействия согласен с Skyle © и sniknik ©
Ega23 (2004-12-22 19:22:00) [18]2 sniknik © (22.12.04 19:11) [12]
select * from J51 where dat between :d_begin and :d_end
d_begin:= StartOfTheMonth()
d_end:= EndOfTheMonth()
StartOfTheMonth() и EndOfTheMonth() - что за функции?
Исторически сложилось, что использую RX-оские компоненты доступа. TRxQuery, в частности. Там замечательная штука есть, макрос называется. К которой можно обратиться через MacroByName. В принципе, аналог параметра. Но в мастер-детальных связках очень удобен.
Ega23 (2004-12-22 19:17:00) [19]А чем они связаны, эти "работы"?
Грубо говоря, если есть выбор - произвести какое-то действие на клиенте, или произвести его в запросе - делаю в запросе.
При чём тут апельсины?
В Delphi результатомshowmessage(IntToStr(Trunc(Now)));будет 38343, а в MS SQL результатомselect Cast(getdate() as int)будет 38342.
Если есть правило, которое гласит, что "конечной датой считается дата после окончания периода", то никаких особых проблем не предвидится.
Остаётся только эту дату вычислить. Я понимаю, что IncMonth применить не сложно, но зачем лишнее действие? Одной даты вполне достаточно...
Соловьев (2004-12-22 19:17:00) [20]WHERE Dat >= '20040101' AND Dat < '20040201'
Имхо, только броблемы для программиста(писать функцию, которая будет по месяцу и году создавать диапазон). Я бы дал пользователю список месяцов и год.