![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Работа с датами в MS SQL Server
Kostafey © (2006-10-25 01:48:00)Приветствую уважаемых мастеров ! Вот ведь проблема не весть какая а справиться не смог. Как обратиться с SQL - запросом к MS SQL Server, таблице с полем тапа smalldatetime ?
Если я пишу с временем, то пишет ошибку incorrect syntax near 10
Result:=Format('select * from ZVK1 where DATE_ZVK1 between %s and %s',
['30/03/2006 10:15:00','30/03/2006 10:35:00']);
Если пишу так (без времени):
Result:=Format('select * from ZVK1 where DATE_ZVK1 between %s and %s',
['30/03/2006','11/04/2006']);
То он мне выдает пустую сетку, в то время как между 30/03 и 11/04 штук 30 записей.
Ну а в таком виде все работает...
Result:=Format('select * from ZVK1',[]);
Anatoly Podgoretsky (2006-10-29 01:49:00) [1]Да хотя бы EncodeDate/EncodeTime использовать, чем такое опасное преобразование
MsGuns (2006-10-29 01:35:00) [2]TDateTimePicker (Win32)
Kostafey (2006-10-29 00:25:00) [3]
> Сначала поехал, а потом увидел куда..
Как-то не ожидал получть столько сложностей в стандартном SQL-запросе.
Вот так напишу лучше будет ?
with ADODataSet1 do
begin
CommandText := 'Select DATE_ZVK1 From ZVK1 where DATE_ZVK1 between :DateFrom and :DateTo';
Parameters.ParamByName('DateFrom').Value:=StrToDateTime('30.03.2006 14:16:00');
Parameters.ParamByName('DateTo').Value:=StrToDateTime('02.04.2006 15:04:00');
Open;
end;
> Чревато спотыками на нестандартных (или нерусских) региональных
> настройках. Например, кому-то очень понравится / в качестве
> разделителя, когда в системе точка. Или наоборот. Лучше
> пикером пользуйся.
Полностью согласен. Но как правильно сделать не знаю. Не поскажите что это такое "пикер" ?
Desdechado (2006-10-28 19:28:00) [4]> StrToDateTime('30.03.2006 14:16:00');
Чревато спотыками на нестандартных (или нерусских) региональных настройках. Например, кому-то очень понравится / в качестве разделителя, когда в системе точка. Или наоборот. Лучше пикером пользуйся.
sniknik (2006-10-28 19:23:00) [5]> Сейчас прошло (хотя я так и не пойму почему)
элементарно, там уже был запрос один в один до последнего байта равный вносимому.
procedure TCustomADODataSet.SetCommandText(const Value: WideString);
begin
if CommandText <> Value then
begin
CheckInactive;
Command.CommandText := Value;
PropertyChanged;
end;
end;
если же нет, то надо смотреть как параметры пере-создаются, с уничтожением коллекции старых и созданием новых или с сохранением и сменой имен (сомнительно...), может там тоже есть "щель" в вероятности получить значения заданные раньше создания обьектов их содержащих...
MsGuns (2006-10-28 18:13:00) [6]>Kostafey © (28.10.06 18:03) [13]
>А чего в нем такого ???
Сначала поехал, а потом увидел куда..
Рекомендую почитать о свойствах и методах компонент, которыми пользуетесь (в данном случае вы игнорируете способность датасета контекстно регировать на изменение св-ва CommandText). Сейчас прошло (хотя я так и не пойму почему) - завтра вместо шоссе "выедете" в овраг.
Kostafey (2006-10-28 18:03:00) [7]> ''20060330'' === 2006 03 30 === 30 марта 2006
> именно такой формат MS SQL понимает однозначно
О! Как просто-то было! И как я не догадался.
> это чисто случайно... после того что ты с кодом данным в
> [7] в [9] сделал... (я бы на его месте обиделся бы... )
> Да опасный код, еще по шее получит от системы.
А чего в нем такого ???
В свойтвах ADODataSet1.Parameters задал 2 параметра (пустых) и все пошло.
Anatoly Podgoretsky (2006-10-28 11:23:00) [8]sniknik © (28.10.06 01:58) [10]
Да опасный код, еще по шее получит от системы.
ЮЮ (2006-10-28 07:49:00) [9]
> От куда взялись цифры ?
> ''20060330'' and ''20060411''''
''20060330'' === 2006 03 30 === 30 марта 2006
именно такой формат MS SQL понимает однозначно
sniknik (2006-10-28 01:58:00) [10]> ВСЕМ СПАСИБО ! ВСЕ РАБОТАЕТ !!!
это чисто случайно... после того что ты с кодом данным в [7] в [9] сделал... (я бы на его месте обиделся бы... )
Kostafey (2006-10-28 01:35:00) [11]ВСЕМ СПАСИБО ! ВСЕ РАБОТАЕТ !!!
with ADODataSet1 do
begin
Parameters[0].Value := StrToDateTime('30.03.2006 14:16:00');
Parameters[1].Value := StrToDateTime('02.04.2006 15:04:00');
CommandText := 'Select DATE_ZVK1 From ZVK1 where DATE_ZVK1 between :d0 and :d1';
Open;
end;
> Свойство того, чего используешь.
Ну вооще-то догадался, просто на всякий пожарный переспросил.
Просто там мго всего еще есть ADOCOnnection, например... а то мало ли?
Anatoly Podgoretsky (2006-10-28 01:12:00) [12]
> Свойство чего ?
Свойство того, чего используешь.
MsGuns (2006-10-28 01:09:00) [13]with ADODataSet do
begin
CommandText := 'Select * From MyTable where DocDate between :d1 and :d2';
Parameters[0].Value := StrToDateTime(Edit1.Text);
Parameters[1].Value := StrToDateTime(Edit2.Text);
Open;
end;
DrPass (2006-10-28 01:09:00) [14]
> А как пользоваться этим ?
Это - в CommandText датасета
> Свойство чего ?
А это - свойство датасета, через которое можно подставить соотв. значения в параметры DateFrom и DateTo
Kostafey (2006-10-28 01:01:00) [15]> > Edit2.Text:=datetostr(ADODataSet1.FieldByName('DATE_ZVK1')
> .
> > AsDate);
Да, он просто выведет дату (напр. 30.03.2006). Задача-то обратная послать SQL - запрос с датой.
Записать в запрос непосредстванно дату у меня не получилось [0], а преобразование даты сначало в число повлекло другие проблемы.
А как пользоваться этим ?
> 'select * from ZVK1 where DATE_ZVK1 between :DateFrom and
> :DateTo'
> и свойство Parameters
Свойство чего ?
DrPass (2006-10-28 00:47:00) [16]
> Kostafey © (28.10.06 00:38) [3]
Наверное, все-ж таки
> Edit2.Text:=datetostr(ADODataSet1.FieldByName('DATE_ZVK1').
> AsDate);
А вообще, см.
> 'select * from ZVK1 where DATE_ZVK1 between :DateFrom and
> :DateTo'
и свойство Parameters
Kostafey (2006-10-28 00:38:00) [17]Возвращаюсь к теме. К сожалению никак не разобрался.
От куда взялись цифры ?
''20060330'' and ''20060411''''
Я получил совсем другие :
Edit3.Text:=inttostr(ADODataSet1.FieldByName('DATE_ZVK1').AsVariant);
Edit2.Text:=floattostr(ADODataSet1.FieldByName('DATE_ZVK1').AsVariant);
Результат
38806
38806,4270833333
И цифру 38806,4270833333 в SQL запрос не вставишь - ошибка, а 38806 - корень всех зол т.к. (ИМХО) это прото-напросто округленное значение
ЮЮ (2006-10-25 03:43:00) [18]А без Format, можно подумать, ну никак не обойтись? Разве апорстрофы после этого остаются? А результат делени 11/04/2006 меньше единицы.
Result:= 'select * from ZVK1 where DATE_ZVK1 between ''20060330'' and ''20060411'''';
А ещё лучше параметрический запрос:
Result:= 'select * from ZVK1 where DATE_ZVK1 between :DateFrom and :DateTo';
Kostafey (2006-10-25 01:53:00) [19]Если написать
Result:=Format('select * from ZVK1 where DATE_ZVK1>=%s and DATE_ZVK1<=%s',
['30/03/2006','11/04/2006']);
то ничего не изменится - сетка остается пустой