Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Работа с датами в 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']);

то ничего не изменится - сетка остается пустой


Наверх

Титульная страница Поиск, карта сайта Написать письмо