![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как установить "SET DATEFORMAT dmy" на сервере MSSQL из программы
Layner © (2005-01-27 14:44:00)Т.е. установить могу без проблем, Но, приходится это делать перед каждым запросом. Проблемы в этом тоже нет, пускай делает, просто думаю не красиво это.
Т.е. у меня DBgrid, в него входят столбцы с датой. Т.е. делаю выборку по дате. Запрос для выборки генерю динамически. Результат выборки отображается в DBgrid.
Для того, чтобы сделать выборку по дате, в приложении в OnCreate ставлю
LongDateFormat:='dd.mm.yyyy';
DateSeparator:='.';
ShortDateFormat:='dd.mm.yyyy';
А на сервере прогоняю запрос в динамически созданной и уничтоженной потом ADOQuery: SET DATEFORMAT dmy
В результате устоновки не сохраняются. Стал копать. В SQL Profiler смотрю. После окончания любого динамического запроса, где ADOQuery создается и уничтожается, проходит такая штука - exec sp_reset_connection, я его сам не генерю. Т.е. этим самым збрасываются все установки. В том числе и даты.
Вопрос, как правильно установить формат даты на сервере MSSQL для клиента?
Заранее благодарю.
MOA (2005-01-27 15:31:00) [1]Да что такое, а :(. Тысячные секунды тоже через двоеточие - hh:mm:ss:qqq
Ega23 (2005-01-27 15:30:00) [2]Ega23
Понятно, varSingle я передавать не буду. А с датой понятно. Только смотри что, мы описываем в константе формат даты как yyyy-mm-dd hh:nn:ss, хотя на сервере не известно, какой стандарт, может тоже американский какой нибудь :(
А ты попробуй. Лично я проблем никаких не имел.
Да, вот ещё пример использования ValX:
ss:='Declare @X int Set Nocount On '+
'Exec @X=S_PersEdit @PersNam1='+ValX(Trim(ePersNam1.Text),',')+' @PersNam2='+ValX(Trim(ePersNam2.Text),',')+
'@PersNam3='+ValX(Trim(ePersNam3.Text),',')+'@PersSexFl='+ValX(cbSex.ItemIndex,',')+
'@PersTabNr='+ValX(eTabNr.Text,',')+
'@PersConstFl='+ValX(cbStatus.ItemIndex,',')+
'@PersNot='+ValX(ePersNot.Text,',')+
'@DepCod='+ValX(DMpas.RQDepForPers.FieldByName('DepCod').AsInteger,',')+
'@ProfCod='+ValX(DMpas.RQProfs.FieldByName('ProfCod').AsInteger,',')+
'@PersDatOut='+ValX(dePersDatOut.Date,',')+'@PersAddress='+ValX(ePersAddress.Text,',')+
'@BirthDat='+ValX(deBirthDat.Date,',')+'@PersPasp='+ValX(ePersPasp.Text,',')+
'@PersWPhonNr='+ValX(ePersWPhon.Text,',')+'@PersHPhonNr='+ValX(ePersHPhon.Text,',')+
'@UserPersID='+Valx(Sessinfo.PersId,',')+'@UserWorkCod='+Valx(sessinfo.Workcod,',');
if Mode=1 then ss:=ss+'@Weight='+lWeight.Caption+',';
MOA (2005-01-27 15:30:00) [3]Не у видел - это, конечно же, именно строки, те. читать:
'yyyymmdd' ('20050127') или 'yyyymmdd hh:mm:ss.qqq' ('20050127 15:28:37.345')
Layner (2005-01-27 15:29:00) [4]NumsOnlyS
Да не, уже с ней разобрался, спасибо.
Сейчас дальше ломаю голову, проще конечно пристыковать к каждому запросу SET DATEFORMAT dmy, пользоваться стандартными ф-я преобразованя даты в строку, да и не мучатся не с чем.
MOA (2005-01-27 15:29:00) [5]Гарантированно сработает в любом стандарте даты вот так: yyyymmdd (20050127) или yyyymmdd hh:mm:ss.qqq (20050127 15:28:37.345)
Удачи!
Ega23 (2005-01-27 15:26:00) [6]NumsOnlyS. - это ещё одна "личная" функция. Если хочешь - могу поделиться. Только будет работать при наличии установленного RXLib.
Layner (2005-01-27 15:16:00) [7][7] stone © (27.01.05 15:11)
Не знаю, не серьезно как то :) Хотя на 100% согласен, что путаница ВООБЩЕ не будет с датой.
ПО идее верхний способ описанный мною должен работать, как бы только добится отмены сброса всех установок.
Ega23
Понятно, varSingle я передавать не буду. А с датой понятно. Только смотри что, мы описываем в константе формат даты как yyyy-mm-dd hh:nn:ss, хотя на сервере не известно, какой стандарт, может тоже американский какой нибудь :(
stone (2005-01-27 15:11:00) [8]
> Ну да, я не про это, может что не так написал, мне важно
> динамический запрос правильно сгененрить с клиента на любой
> машине :(
Ну а кто тебе мешает составить запрос типа
where DateField = 38377.6353404
Layner (2005-01-27 15:06:00) [9]Ega23
Да, желаю удачи жене на родах! :)
У меня самого недавно дочь родилась, уже год и 3 месяца, время летит :)
Layner (2005-01-27 15:03:00) [10]stone © (27.01.05 15:02)
Ну да, я не про это, может что не так написал, мне важно динамический запрос правильно сгененрить с клиента на любой машине :(
stone (2005-01-27 15:02:00) [11]
> Т.е. у меня DBgrid, в него входят столбцы с датой. Т.е.
> делаю выборку по дате.
Дата - это число с плавающей точкой. Формат имеет значение только для отображения данных.
Layner (2005-01-27 15:02:00) [12]Спасибо Ega23 ©!
Только у меня ошибка компиляции, ругается на NumsOnlyS.
Ega23 (2005-01-27 14:50:00) [13]
const SQLDateTimeFmt='"{ts''" yyyy-mm-dd hh:nn:ss"'' }"';
Function Valx( i:Variant;d:string=''):string;{ret: <Str_of_Var>, }
//var //ss:string;
// n:numeric;
begin
result:='';
try
case VarType(i) of
varEmpty,// = $0000;
varNull: result:='Null'+d;
varString: result:=''''+i+''''+d ;
varDate: begin
DateTimeToString(result,SQLDateTimeFmt,i);
result:=result+d ;
end;
varDouble,
varSingle: result:=NumsOnlyS(VarToStr(i)) +d;
else result:=VarToStr(i)+d;
end;//case
except
result:='';exit;
end;
end;
Я через такую байду все дин.запросы прогоняю.
Т.е.
ss:='select * from Table1 where DateTimeField ='+ValX(Now);
Layner (2005-01-27 14:48:00) [14]... у нас винда разная, есть английская, есть русская, у обоих стандарты дат разные. А надо, что бы клиент и там и там работал :(