Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.11.12;
Скачать: CL | DM;

Вниз

Работа с датами в MS SQL Server   Найти похожие ветки 

 
Kostafey ©   (2006-10-25 01:48) [0]

Приветствую уважаемых мастеров ! Вот ведь проблема не весть какая а справиться не смог. Как обратиться с 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",[]);


 
Kostafey ©   (2006-10-25 01:53) [1]

Если написать

Result:=Format("select * from ZVK1 where DATE_ZVK1>=%s and DATE_ZVK1<=%s",
        ["30/03/2006","11/04/2006"]);

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


 
ЮЮ ©   (2006-10-25 03:43) [2]

А без 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-28 00:38) [3]

Возвращаюсь к теме. К сожалению никак не разобрался.
От куда взялись цифры ?
""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 - корень всех зол т.к. (ИМХО) это прото-напросто округленное значение


 
DrPass ©   (2006-10-28 00:47) [4]


> 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 01:01) [5]

> > 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 01:09) [6]


> А как пользоваться этим ?

Это - в CommandText датасета
> Свойство чего ?


А это - свойство датасета, через которое можно подставить соотв. значения в параметры DateFrom и DateTo


 
MsGuns ©   (2006-10-28 01:09) [7]

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;


 
Anatoly Podgoretsky ©   (2006-10-28 01:12) [8]


> Свойство чего ?

Свойство того, чего используешь.


 
Kostafey ©   (2006-10-28 01:35) [9]

ВСЕМ СПАСИБО ! ВСЕ РАБОТАЕТ !!!

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, например... а то мало ли?


 
sniknik ©   (2006-10-28 01:58) [10]

> ВСЕМ СПАСИБО ! ВСЕ РАБОТАЕТ !!!
это чисто случайно... после того что ты с кодом данным в [7] в [9] сделал... (я бы на его месте обиделся бы... )


 
ЮЮ ©   (2006-10-28 07:49) [11]


> От куда взялись цифры ?
> ""20060330"" and ""20060411""""


""20060330"" === 2006 03 30 === 30 марта 2006
именно такой формат MS SQL понимает однозначно


 
Anatoly Podgoretsky ©   (2006-10-28 11:23) [12]

sniknik ©   (28.10.06 01:58) [10]
Да опасный код, еще по шее получит от системы.


 
Kostafey ©   (2006-10-28 18:03) [13]

> ""20060330"" === 2006 03 30 === 30 марта 2006
> именно такой формат MS SQL понимает однозначно

О! Как просто-то было! И как я не догадался.


> это чисто случайно... после того что ты с кодом данным в
> [7] в [9] сделал... (я бы на его месте обиделся бы... )


> Да опасный код, еще по шее получит от системы.

А чего в нем такого ???
В свойтвах ADODataSet1.Parameters задал 2 параметра (пустых) и все пошло.


 
MsGuns ©   (2006-10-28 18:13) [14]

>Kostafey ©   (28.10.06 18:03) [13]
>А чего в нем такого ???

Сначала поехал, а потом увидел куда..

Рекомендую почитать о свойствах и методах компонент, которыми пользуетесь (в данном случае вы игнорируете способность датасета контекстно регировать на изменение св-ва CommandText). Сейчас прошло (хотя я так и не пойму почему) - завтра вместо шоссе "выедете" в овраг.


 
sniknik ©   (2006-10-28 19:23) [15]

> Сейчас прошло (хотя я так и не пойму почему)
элементарно, там уже был запрос один в один до последнего байта равный вносимому.

procedure TCustomADODataSet.SetCommandText(const Value: WideString);
begin
 if CommandText <> Value then
 begin
   CheckInactive;
   Command.CommandText := Value;
   PropertyChanged;
 end;
end;


если же нет, то надо смотреть как параметры пере-создаются, с уничтожением коллекции старых и созданием новых или с сохранением и сменой имен (сомнительно...), может там тоже есть "щель" в вероятности получить значения заданные раньше создания обьектов их содержащих...


 
Desdechado ©   (2006-10-28 19:28) [16]

> StrToDateTime("30.03.2006 14:16:00");
Чревато спотыками на нестандартных (или нерусских) региональных настройках. Например, кому-то очень понравится / в качестве разделителя, когда в системе точка. Или наоборот. Лучше пикером пользуйся.


 
Kostafey ©   (2006-10-29 00:25) [17]


> Сначала поехал, а потом увидел куда..

Как-то не ожидал получть столько сложностей в стандартном 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;



> Чревато спотыками на нестандартных (или нерусских) региональных
> настройках. Например, кому-то очень понравится / в качестве
> разделителя, когда в системе точка. Или наоборот. Лучше
> пикером пользуйся.


Полностью согласен. Но как правильно сделать не знаю. Не поскажите что это такое "пикер" ?


 
MsGuns ©   (2006-10-29 01:35) [18]

TDateTimePicker (Win32)


 
Anatoly Podgoretsky ©   (2006-10-29 01:49) [19]

Да хотя бы EncodeDate/EncodeTime использовать, чем такое опасное преобразование



Страницы: 1 вся ветка

Текущий архив: 2006.11.12;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.03 c
1-1159539430
Art_infinity
2006-09-29 18:17
2006.11.12
организация доступа к портам...


8-1144416142
NightLord
2006-04-07 17:22
2006.11.12
TGA and GLScene


2-1161968029
Max.66RUS
2006-10-27 20:53
2006.11.12
Пара простых вопросов...


15-1161346296
ArtemESC
2006-10-20 16:11
2006.11.12
Задачка по физике


15-1161112759
DillerXX
2006-10-17 23:19
2006.11.12
Аквариум (группа)