Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2005.02.13;
Скачать: [xml.tar.bz2];

Вниз

Опять про даты в MSSQL, но другое   Найти похожие ветки 

 
sergey18   (2005-01-12 16:01) [0]

Проблема такая: поставил MS SQL Server, возможно не совсем корректно, т.к. имел мало опыта общения с ним. И в итоге был удивлен тем, что при добавлении или изменении поля типа DateTime в любой таблице, вариант с форматом Год-месяц-день не проходит. Он мне их менял местами и в итоге при запросе:
INSERT INTO TestTable (TestDate) VALUES ("2004-5-1") добавлялось в базу не 1 марта 2004, а 5 января 2004. А при запросе:
INSERT INTO TestTable (TestDate) VALUES ("2004-5-25") выдавалась ошибка "The conversion of a char data type to a datetime data type resulted in an out-of-range datetime value.".

Правильным запросом SQL Server считал такой:
INSERT INTO TestTable (TestDate) VALUES ("25.05.2004")

Пришлось писать программу, которая использовала именно этот формат даты в запросе. Спорить не буду, может я чего-нибудь и намудрил с датами при установке MSSQL.

А теперь по прошествию времени, когда программа уже написана, она по необходимости перенесена на другой сервер, где MS SQL настроен правильно - т.е. ситуация с запросами там прямо противоположная.

Вопрос: Знаю, что MSSQL хранит дату в числовом виде, поэтому подскажите, пожалуйста, как и где можно указать MS SQL Server"у формат принимаемой (понимаемой даты), т.е. изменить его с Год-Месяц-День, на День.Месяц.Год?

P.S. Исходники программы менять не могу, т.к. очень мало времени, а программа - довольно-таки внушительных размеров. В спешке боюсь забыть где-то что-то не поменять и начнутся проблемы, возможно даже не сразу, а впоследствии, когда уже трудно будет понять, что и из-за чего...

Спасибо, искренне надеюсь на вашу помощь!


 
Fay ©   (2005-01-12 16:05) [1]

"20040105" = 5 января 2004. Прокатит всегда
А ваще, смотри в BOL на convert


 
Ega23 ©   (2005-01-12 16:13) [2]


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;



 
sergey18   (2005-01-12 16:15) [3]

2 Fay:
Спасибо за совет, но мне уже поздно - программа написана под тот формат. В следующий раз буду пользовать "20040105".

Мне нужно, чтобы SQL Server понимал запрос вида:
INSERT INTO TestTable (TestDate) VALUES ("01.05.2004")


 
Johnmen ©   (2005-01-12 16:20) [4]

http://www.sql.ru/faq/faq_topic.aspx?fid=109


 
sergey18   (2005-01-12 16:21) [5]

2 Ega23:
1) А что это за функция? Не совсем понятно для чего она...
2) Функции мне уже поздно вставлять... Я не хочу менять код программы, я хочу поменять восприятие MS SQL Server"а... Ведь это же возможно?
3) В твоей функции используется не совсем понятная функция "NumsOnlyS", которую Delphi не знает.


 
sergey18   (2005-01-12 16:27) [6]

2 Johnmen:
Спасибо!!! Помогло! Для меня подошел последний вариант.

Расскажу для других пользователей, которые возможно тоже столкнуться с подобной проблемой:
Нужно задать подходящий language для используемого sql login-а. С помощью утилиты Enterprise Manager.
Это ведет к неявному выполнению SET DATEFORMAT при установлении коннекта. Правда эта установка будет влиять и на результаты некоторых других функций. Например, на DATENAME, возвращающую символьное именование даты


 
KSergey ©   (2005-01-13 09:44) [7]

> [6] sergey18   (12.01.05 16:27)
> Расскажу для других пользователей, которые возможно тоже
> столкнуться с подобной проблемой:

Это не проблема. Это издевательство.
Лучше все же переписать прогу, что как правило не страшно а даже полезно
Да и изменения тут скорее косметического характера.

Вот 2 ф-ции, конфертят с строку, годную для подстановки в SQL-запрос.
Хотя, признаться, не уверен, что написаны они хорошо, но работают стопудово.

// -------- преобразует из типа даты в текстовый, подходящий для подстановки в запросы -----
function DateToMSSQLString (const dtmDateTime : TDateTime) : String; // для MSSQL
var s_Year, s_Month, s_Day: string;
   Year, Month, Day: word;
begin
 Year:=0; Month:=0; Day:=0;
 DecodeDate(dtmDateTime, Year, Month, Day);
 s_year:=IntToStr(Year);
 s_Month:=IntToStr(Month); if Month<10 then s_Month:="0"+s_Month;
 s_Day:=IntToStr(Day); if Day<10 then s_Day:="0"+s_Day;
 Result:=s_Year+s_Month+s_Day;
end;
// -------- преобразует из типа даты-время в текстовый, подходящий для подстановки в запросы -----
function DateTimeToMSSQLString (const dtmDateTime : TDateTime) : String;  // для MSSQL
// Формирование такой строки, кот. правильно понимает сервер:  "20040620 hh:mm:ss"
var s_Year, s_Month, s_Day, s_hour, s_min, s_sec: string;
   Year, Month, Day, Hour, Min, Sec, MSec: word;
begin
 Year:=0; Month:=0; Day:=0;
 DecodeDate(dtmDateTime, Year, Month, Day);
 Hour:=0;Min:=0;Sec:=0;MSec:=0;
 DecodeTime(dtmDateTime, Hour, Min, Sec, MSec);
 s_year:=IntToStr(Year);
 s_Month:=IntToStr(Month); if Month<10 then s_Month:="0"+s_Month;
 s_Day:=IntToStr(Day); if Day<10 then s_Day:="0"+s_Day;
 s_hour:=IntToStr(Hour); if Hour<10 then s_hour:="0"+s_hour;
 s_min:=IntToStr(Min); if Min<10 then s_min:="0"+s_min;
 s_sec:=IntToStr(Sec); if Sec<10 then s_sec:="0"+s_sec;
 Result:=s_Year+s_Month+s_Day+" "+s_hour+":"+s_min+":"+s_sec;
end;


 
Ega23 ©   (2005-01-13 10:29) [8]

1) А что это за функция? Не совсем понятно для чего она...

Для динамического формирования запроса. Например:
      ss:="exec S_PersEdit @mode=3, @PersID="+
  DMpas.RQPers.FieldByName("PersID").AsString+","+
 "@UserPersID="+Valx(SessInfo.PersId,",")+"@UserWorkCod="+Valx(SessInfo.Workcod);


 
sniknik ©   (2005-01-13 10:48) [9]

чего только люди не придумают лижбы правильно не делать... параметры зачем по вашему?

KSergey ©   (13.01.05 09:44) [7]
это замена функций
FormatDateTime("yyyymmdd", dtmDateTime)
FormatDateTime("yyyymmdd hh":"nn":"ss", dtmDateTime)
?

тебе наверное построчно платят. ;о)))



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

Форум: "Базы";
Текущий архив: 2005.02.13;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.039 c
14-1106553247
Чеширский_Кот
2005-01-24 10:54
2005.02.13
WinAmp Remote Control


3-1105599161
Jann
2005-01-13 09:52
2005.02.13
из dbf в txt


14-1106677983
amit
2005-01-25 21:33
2005.02.13
FreePascal


14-1106384467
Серый
2005-01-22 12:01
2005.02.13
Смешная ссылка


1-1106881630
gsformat
2005-01-28 06:07
2005.02.13
как отловить утечку памяти





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский