Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 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 Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: 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

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

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]

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 25 апреля 2026, 22:16
Выполнено за 0.03 сек.