Форум: "Базы";
Текущий архив: 2005.01.30;
Скачать: [xml.tar.bz2];
ВнизSQL запрос Найти похожие ветки
← →
Nata © (2004-12-22 18:21) [0]Доброго времени суток. Помогите составить запрос . Надо из таблицы J51 ( поля таблицы : dat(дата) и name (наименования)) выбрать все записи за какой-либо месяц ( к примеру за январь 2004 или октябрь2004).
← →
Ega23 © (2004-12-22 18:35) [1]СУБД какая?
← →
Sergey13 © (2004-12-22 18:37) [2]select * from J51 where dat between :d_begin and :d_end
:d_begin и :d_end параметры начала и конца периода типа дата.
← →
Skyle © (2004-12-22 18:40) [3]
> Sergey13 © (22.12.04 18:37) [2]
Я бы предложил
...where dat >= Начало_месяца and Dat < Начало_следующего
Если дополнительно указано время, то могут быть казусы.
← →
Ega23 © (2004-12-22 18:42) [4]2 Sergey13 © (22.12.04 18:37) [2]
Была какая-то фича с between и датами. Типа, не выбирались граничные значения.
В диалекте MS SQL я написал быSelect * from J51 where Year(dat)=2004 and Month(dat)=1
← →
Соловьев © (2004-12-22 18:42) [5]select *
from j51
where extract(month from dat) = 1
← →
Соловьев © (2004-12-22 18:44) [6]2 Ega23 © (22.12.04 18:42) [4]
а я бы datepart() :)
← →
Ega23 © (2004-12-22 18:45) [7]а я бы datepart() :)
Year(), Month() и Day() - частные случаи datepart :о)
← →
Skyle © (2004-12-22 18:52) [8]> Ega23 ©
> Соловьев ©
А я бы не выкаблучивался, вызывая не очень нужные функции и снижая удобочитаемость ;-))))))
Хотя монастырь опять же...
← →
Ega23 © (2004-12-22 18:58) [9]А я бы не выкаблучивался, вызывая не очень нужные функции и снижая удобочитаемость ;-))))))
Спорный вопрос. Так на клиенте замучаешься конечную дату подбирать.
А с учётом того, что у datetime из MS SQL и у TDateTime из Borland разные нулевые значения...
В общем, предпочитаю такую работу на SQL делать, а не на клиенте.
← →
Skyle © (2004-12-22 19:06) [10]
> Так на клиенте замучаешься конечную дату подбирать.
Не стоит решать административные проблемы программно.
Если есть правило, которое гласит, что "конечной датой считается дата после окончания периода", то никаких особых проблем не предвидится.
> что у datetime из MS SQL и у TDateTime из Borland разные
> нулевые значения
При чём тут апельсины?
> предпочитаю такую работу на SQL делать
А чем они связаны, эти "работы"?
← →
Соловьев © (2004-12-22 19:10) [11]2 Skyle
интересно, а как бы Вы написали запрос который возвратит
"... выбрать все записи за какой-либо месяц ( к примеру за январь 2004 или октябрь2004)..." ?
← →
sniknik © (2004-12-22 19:11) [12]> В диалекте MS SQL я написал бы
> ...
зря, если есть по полю индекс то он будет бесполезен.
> а я бы datepart() :)
аналогично
> Спорный вопрос. Так на клиенте замучаешься конечную дату подбирать.
select * from J51 where dat between :d_begin and :d_end
d_begin:= StartOfTheMonth()
d_end:= EndOfTheMonth()
> А с учётом того, что у datetime из MS SQL и у TDateTime из Borland разные нулевые значения...
ну и что? а ты проверь, вот так с параметрами... (пропускает день? лишний захватывает?)
> В общем, предпочитаю такую работу на SQL делать, а не на клиенте.
а вот это уже аргумент. на вкус на цвет...
← →
Skyle © (2004-12-22 19:12) [13]> Соловьев © (22.12.04 19:10) [11]
SELECT Dat, Name
FROM J51
WHERE Dat >= "20040101" AND Dat < "20040201"
P.S. MS SQL.
← →
Соловьев © (2004-12-22 19:17) [14]WHERE Dat >= "20040101" AND Dat < "20040201"
Имхо, только броблемы для программиста(писать функцию, которая будет по месяцу и году создавать диапазон). Я бы дал пользователю список месяцов и год.
← →
Ega23 © (2004-12-22 19:17) [15]А чем они связаны, эти "работы"?
Грубо говоря, если есть выбор - произвести какое-то действие на клиенте, или произвести его в запросе - делаю в запросе.
При чём тут апельсины?
В Delphi результатомshowmessage(IntToStr(Trunc(Now)));
будет 38343, а в MS SQL результатомselect Cast(getdate() as int)
будет 38342.
Если есть правило, которое гласит, что "конечной датой считается дата после окончания периода", то никаких особых проблем не предвидится.
Остаётся только эту дату вычислить. Я понимаю, что IncMonth применить не сложно, но зачем лишнее действие? Одной даты вполне достаточно...
← →
Ega23 © (2004-12-22 19:22) [16]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. В принципе, аналог параметра. Но в мастер-детальных связках очень удобен.
← →
Соловьев © (2004-12-22 19:23) [17]хотя с точки зрения быстродействия согласен с Skyle © и sniknik ©
← →
Ega23 © (2004-12-22 19:24) [18]2 sniknik © (22.12.04 19:11) [12]
зря, если есть по полю индекс то он будет бесполезен.
А вот это уже серьёзный аргумент. Учту на будущее.
← →
Ega23 © (2004-12-22 19:25) [19]Во нафлудили-то...
А автор, как обычно, пропал... :о)
← →
sniknik © (2004-12-22 19:33) [20]> При чём тут апельсины?
> В 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)
← →
sniknik © (2004-12-22 19:37) [21]> StartOfTheMonth() и EndOfTheMonth() - что за функции?
uses DateUtils + F1
← →
Ega23 © (2004-12-22 19:42) [22]проверь правильно
Да где-ж тут правильно-то... Способов дофига, каждый что-то своё выдаёт: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.
← →
Ega23 © (2004-12-22 19:43) [23]2 sniknik © (22.12.04 19:37) [21]
> StartOfTheMonth() и EndOfTheMonth() - что за функции?
uses DateUtils + F1
Delphi какой? Семёрка, поди?
← →
Skyle © (2004-12-22 19:50) [24]Сорри за тормоза, диалап - смерть..:(((
> Соловьев © (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.
Мы уже обсуждаем нули? По мне так вопрос был в ином.
Или кому-то могут потребоваться данные в прошлом относительно одного из нулей? Вот тут - соглашусь, но опять же, ноль - понятие относительное %-)
> Остаётся только эту дату вычислить
Если ваша бухгалтерия не знает, какой датой она должна вам дать зарплату, то я только посочуствую..;-))))))
← →
Skyle © (2004-12-22 19:58) [25]> Во нафлудили-то...
По мне так это не флуд, а нечто иное...
P.S. прошу простить грамматические ошибки в моём посте [24] :)))
← →
Nata © (2004-12-22 20:13) [26]ну... я теперь вообще ничего не пойму..(( я новичок.. с SQL впервые столкнулась.. можно попонятней разъяснить(((
я использую interbase.
← →
Zacho © (2004-12-22 20:24) [27]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
← →
sniknik © (2004-12-22 20:50) [28]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, а с параметром переданным в запрос как дата... или ты думаеш ты первый обратил внимание на разницу в точке отчета?
← →
Skyle © (2004-12-22 21:29) [29]> Nata © (22.12.04 20:13) [26]
> можно попонятней разъяснить(((
Что именно нуждается в объяснении?
Какой-то конкретный ответ или какое-то телодвижение?
Прошу указать.
<offtop>
> Zacho © (22.12.04 20:24) [27]
Хочу знать твоё решение по нашему общему вопросу.
</offtop>
← →
Zacho © (2004-12-22 21:58) [30]Skyle © (22.12.04 21:29) [29]
<offtop>
Проверь почту.
</offtop>
← →
Sergey13 © (2004-12-23 09:29) [31]На пустом месте 30 постов - круто! 8-)
Варианты с функциями извлечения месяца/года в SQL запросе приведут, скорее всего, к полному просмотру таблицы, даже при индексированом поле даты. Или нужен индекс по функции. Вариант с
between :d_begin and :d_end
или
where dat >= Начало_месяца and Dat < Начало_следующего
будет использовать обычный индекс.
Так что, мое ИМХО, не все надо пихать в SQL. 8-)
← →
sniknik © (2004-12-23 11:16) [32]> На пустом месте 30 постов - круто! 8-)
вот и ты отметился, хотя твой ответ повтор того что уже было... ;)
← →
Sergey13 © (2004-12-23 11:22) [33]2[32] sniknik © (23.12.04 11:16)
Сори. В таком объеме не углядел. Признаю свою ошибку. 8-)
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2005.01.30;
Скачать: [xml.tar.bz2];
Память: 0.54 MB
Время: 0.037 c