|
Вопрос # 1 809/ вопрос открыт / |
|
Здравствуйте, эксперты!
Программирую на Delphi недавно, ну мож год не больше(хочу научится писать программы хоть на среднем уровне), поэтому не смейтесь за наивные вопросы.
Вобщем дело обстоит так:
1.Есть база данных на SQL Server 2005, писал не я.
2.Наваял я программу которая изменяет некоторые данные в этой базе, все просто чудесно когда региональные настройки
совпадают( тоесть я тестировал на Windows XP RU +SQL Server 2005 Ru и клиенте тож Windows XP Ru).
Но!!! если Windows XP Eng+SQL Server 2005 Eng, а клиент на Windows XP Ru(другие комбинации не пробовал), начинаются косяки с переводом формата Даты и
времени(т.е. прога вываливается с ошибкой, типа немогу конвертировать, неправильная дата), ведь у буржуинов сначало месяц, потом день.
Да, вот еще, в базе данных этот формат хранится с Русскими региональными настройками(т.е. 18.08.2007 01:45:34), и основная программа работает "на ура",
возможно она эти данные пишет через хранимые процедуры, в которых определен формат даты, мне такого нельзя(всмысле писать хранимые процедуры). В связи
с этим вопрос, как мне или какую команду передать на сервер чтоб он записал ДатуВремя по моему формату, и я не гадал бы на какой винде(Ru или Eng) стоит SQL Server.
Если можно, то пример кода приведите, тыкните носом пожалуйста, очень надо, жизнь заставляет.
 |
Вопрос задал: Vendigo (статус: Посетитель)
Вопрос отправлен: 8 августа 2008, 02:23
Состояние вопроса: открыт, ответов: 0.
|
Мини-форум вопроса
Всего сообщений: 25; последнее сообщение — 11 августа 2008, 17:48; участников в обсуждении: 4.
Страницы: [« Предыдущая] [1] [2]
|
Мережников Андрей (статус: Абитуриент), 8 августа 2008, 23:03 [#21]:
Я же писал Вам - откажитесь от передачи данных через параметры!!!! Написал Вам пример как это можно сделать. То же самое, что позже Вам написал Вам Вадим К!
to Еремин А.А.: Где можно подробнее прочитать про правила ответа на вопросы, чтобы не попадать в нелепую ситуацию удаления ответов?
|
|
Вадим К (статус: Академик), 8 августа 2008, 23:56 [#22]:
вот кусочек юнита, который Вам поможет. Точно работает с MS Access и должно работать с MS SQL.
unit DBUtils;
interface
uses DateUtils, Classes, SysUtils;
function DateToSQL(DT: TDateTime): string;
function StrToSQL(s: string): string;
function BoolToSQL(b: boolean): string;
implementation
function DateToSQL(DT: TDateTime): string;
begin
Result := format('#%d/%d/%d#', [MonthOf(DT), DayOf(DT), YearOf(DT)]);
end;
function StrToSQL(s: string): string;
begin
Result := '"' + StringReplace(s, '"', '""', [rfReplaceAll]) + '"';
end;
function BoolToSQL(b: boolean): string;
begin
if b then Result := 'True'
else Result := 'False';
end;
end.
Внимательно следите за кавычками в StrToSQL!
Галочка "подтверждения прочтения" - вселенское зло.
|
|
Vendigo (статус: Посетитель), 9 августа 2008, 18:16 [#23]:
Большое спасибо Всем кто откликнулся.
Вот еще нарыл на просторах интернета:
На преобразование строки в дату влияют следующие установки текущего соединения: SET DATEFORMAT - формат даты, SET LANGUAGE - текущий язык. Если передавать дату в формате 'YYYYMMDD' (для даты со временем 'YYYYMMDD HH:MM:SS' или 'YYYYMMDD HH:MM:SS.NNN'), то она будет восприниматься сервером однозначно, независимо от установок SET DATEFORMAT, SET LANGUAGE. Например, '20050310', '20050310 13:49:03', '20050310 13:49:03.000'.
Другой, менее удобный вариант - использовать в запросе функцию CONVERT с указанием фиксированного формата даты (подробнее см. Books Online). Например, CONVERT(DATETIME, '7/19/1996', 101) - 19 июля 1996 года.
Другие варианты передачи дат требуют знания формата даты для текущего соединения:
1. При использовании строки с указанием даты с разделителями (например, '01.12.2004') SQL-сервер для преобразования использует текущий формат даты (установленный с помощью SET DATEFORMAT)
2. При использовании символьного месяца в дате (например, '01 Jan 2004') дата интерпретируется однозначно, независимо от формата даты, но названия месяца следует указывать в соответствии с установками текущего языка (установленного с помощью SET LANGUAGE). Так, для языка Deutsch дата '01 May 2005' будет некорректной.
----------------------------------------------------------------------------------
Тоесть если я правильно понял, после подключения мне надо послать
серверу команду 'SET DATEFORMAT dmy' и тогда SQL Server будет воспринимать дату как - День.Месяц.Год. и если я щас отправлю команду на обновление записи ДатыВремени (например 20.08.2008 14:00:00), то сервер правильно ее поймет(тоесть как 20.08.2008 14:00:00). Я прав?
|
|
Вадим К (статус: Академик), 9 августа 2008, 18:23 [#24]:
да, по идее всё должно отработать. Вот только насколько я знаю, писать надо где то так
Query.SQL.Add('SET DATEFORMAT "DMY"');
Query.SQL.Add('SELECT * FROM ...' );
Query.execute;
Галочка "подтверждения прочтения" - вселенское зло.
|
|
Zavist Akop (статус: Посетитель), 11 августа 2008, 17:48 [#25]:
Я сам почти новичок, но давно уже делаю примерно так:
var DN,DK:Tdate;
......
s:='SELECT * FROM SALES WHERE ( DATA >= %d) and (data <= %d)';
s:=format(s,',[trunc(dn),trunc(dk)]);
sql.add(s)
......
При этом убиваются 2 зайца - без разницы региональные настройки и не надо проверять еще значение времени в поле.
Если не уверен, что в поле DATA хранится точно только дата, но и еще время, можно писать так
s:='SELECT * FROM SALES WHERE ( DATA >= %d) and (data < %d)';
s:=format(s,',[trunc(dn),trunc(dk)+1]);
Я что-то делаю не так ?
|
Страницы: [« Предыдущая] [1] [2]
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|