[MSSQL i Delphi]Problem z datami

0

Cześć, sytuacja wygląda jak dla mnie dziwnie. Otóż.
Są 2 komputery. Na jednym z nich jest Delphi 2005 i MSSQL 2005 Express.
Na drugim no, jest MDAC 2.81 zainstalowane.

Teraz tak, posługuję się komponentami ADO.

Na komputerze, na którym jest Delphi program działa ok, natomiast:

Jeśli zapytanie:

SELECT * FROM V_LOG  
WHERE [dbo].get_date(nDate)='2007-02-14' and UID=1001 
ORDER BY [dbo].get_date(nDate), [dbo].get_time(nTime), nazwisko

(DOKŁADNIE takie się tworzy w programie)
wykonam na serwerze, to dostaję błąd:
The conversion of a char data type to a datetime data type resulted in an out-of-range datetime value.
Natomiast wywołane zapytanie z programu(na kompie z Delphi) działa ok.

Jeśli natomiast napiszę to zapytanie tak(w dacie zamienione miesiące z dniami)

SELECT * FROM V_LOG  
WHERE [dbo].get_date(nDate)=[dbo].get_date('2007-14-02') and UID=1001 
ORDER BY [dbo].get_date(nDate), [dbo].get_time(nTime), nazwisko

to na serwerze idzie ok.

get_date zwraca mi po prostu varchara, który przedstawia tylko datę(bez czasu)

Teraz program uruchamiam na drugim kompie i wyskakuje mi błąd:
The conversion of a char data type to a datetime data type resulted in an out-of-range datetime value.

WTF?
Tak jakby komp z Delphim wiedział, gdzie w zapytaniu ma datę(chociaż ma tam stringa) i odpowiednio zamieniał przed wysłaniem na serwer. Ale to chyba mało możliwe, co?
O co może mu chodzić?

0

uzyj w sqlu convert(datetime, 'string', numer_formatu_daty), zeby sql wiedzial jakiego formatu uzywasz - domyslnie jest jakis i niekoniecznie dni i miesiace sa tam gdzie myslisz... Luknij w dokumentacje na convert

0
johny_bravo napisał(a)

uzyj w sqlu convert(datetime, 'string', numer_formatu_daty), zeby sql wiedzial jakiego formatu uzywasz -

Używam tego w funkcji get_date, która wygląda tak:

CREATE FUNCTION [dbo].[get_date]
(
    @date datetime
)
RETURNS varchar(11)
AS
BEGIN
    DECLARE @Result varchar(11) 
    SET @result = CONVERT(varchar(11),@date,101)    
    RETURN @Result
END
0
[dbo].get_date(nDate)=[dbo].get_date('2007-14-02')

pierszwe wywolanie get_date jest w porzadku, bo podajesz (jak mniemam) datetime, ale drugie juz odpada, bo podajesz varchar - a poniewaz parametr tej funkcji to datetime to nastepuje niejawna konwersja - czyli to co przedtem bylo problemem o ile pamietam.

0
johny_bravo napisał(a)
[dbo].get_date(nDate)=[dbo].get_date('2007-14-02')

pierszwe wywolanie get_date jest w porzadku, bo podajesz (jak mniemam) datetime, ale drugie juz odpada, bo podajesz varchar - a poniewaz parametr tej funkcji to datetime to nastepuje niejawna konwersja - czyli to co przedtem bylo problemem o ile pamietam.

Jak mam to zrobić, skoro ta data idzie z Delphi?

Wykryłem mniej więcej, że błąd leży w sposobie połączenia się z bazą. Gdy connection string wygląda tak:
Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;User ID=%USER%;Initial Catalog=naftoremont;Data Source=ELISABETH\SQLEXPRESS

to jest dobrze, ale jeśli wygląda tak:
Provider=SQL Native Client;Server=ELISABETH\SQLEXPRESS;Database=naftoremont;Uid=%PASSWORD%;Pwd=%USER%

to jest źle. Co mogę zrobić?

0

W jaki sposob podajesz date w delphi? Stringiem czy jakims tamtejszym typem datetime?

Generalnie zdecyduj sie czy w zapytaniu porownujesz stringi czy datetime. Czyli albo:

where date = to_co_przyszlo_z_delphi_jakis_ichniejszy_datetime

albo

where [dbo].get_date(date) = 'string_z_delphi_ktory_juz_jest_poprawnie_sformatowany'

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0