SQL server format daty w zapytaniu

0

Komputer1; WindowsXP Pro 32bit, MSSQLSERVER 2008 R2 32bit
Komputer2; Windows7 Pro 64bit, MSSQLServer 2008 R2 64bit
Po przeniesieniu bazy z komputera1 na komputer2 zauważyłem taką nieprawidłowość:

Tabela1(id:int; data:datetime; id_sklepu:int)

Tabela załadowana danymi z datą w formacie 'YYYY-MM-DD' - zawiera wpisy prawie każdego dnia pierwszego kwartału roku.

Wydając w MS SQL Server Mangament Studio na komputerze1 zapytanie
SELECT * FROM Tabela1 where data='2013-04-23'
otrzymywałem rekordy z daną datą.

Teraz otrzymuje błąd:
The conversion of a varchar data type to a datetime data type resulted in an out-of-range value.

Zmienił się sposób zapisu daty w zapytaniu na 'yyyy-dd-mm'.
Uruchomienie zapytania z powyższą datą zwraca rekordy w formacie yyyy-mm-dd.

Co ciekawe łączę się lokalnie z tą bazą poprzez ADOConnection z programu napisanego w Delphi i wszystko jest w porządku.

1

jeśli pole jest typu date a ty porównujesz je do stringa to następuje niejawna konwersja. Dodatkowo nie podajesz w jakim formacie jest Twój ciąg z datą więc serwer używa takiego formatu jaki ma system. A że teraz format w systemie jest inny więc i innego formatu baza oczekuje. W ADO zapewne podajesz datę jako datę przez parametr. Jeśli chcesz podawać datę w formie ciągu to używaj jawnej konwersji na typ date

0

Witam,

Znalazłem inne rozwiązanie:

SET DATEFORMAT dmy

Po zrobieniu INSERT nastąpi aktualizacja, a w celu sprawdzenia, czy zadziałało wpisujesz:

dbcc useroptions

Wziąłem to z tego: http://blogs.msdn.com/b/sqlserverfaq/archive/2009/11/13/how-to-change-date-format-after-installing-sql-server.aspx

Pozdrawiam

2

O matko i corko :)
Co to za dziwne podejscia.

Jesli porownujesz daty to jedyny 100% zgodny tryb to opcja ISO.

select * from Tabela t where t.Data > '20120228 00:00:01'

nastapi niejawna konwersja typu string do datetime.

0

SET DATEFORMAT mdy oraz zmiana domyślnego języka bazy na Us_english.
Dziękuję za poświęcony czas.

0

nie jest to poprawne podejscie. Za kazdym razem bedziesz zmienial jezyk na bazie? a co z tempdb? Tak jak pisalem jedyny poprawny sposob to 'YYYYMMDD HHSS'

0

Zdaje sobie sprawę, że zmiana języka to połowiczne rozwiązanie. Tempdb się nie interesowałem. Masz na myśli jakiś konkretny parametr?

0

tak - konkretne pisanie kodu sql

select * from Tabela where MojePole1 > '20120221'

W taki sposob jest to uniwersalne i nie wymaga zadnych dziwnych setow.
btw jesli uzywasz parametrow a nie sklejasz kod to powinno byc ok i bez tego.

select * from Tabela where MojePOle1 > :Param1

np w delphi
Query1.ParamByName('Param1').Value := Now()
0

Rozsądne rozwiązanie. Dziękuję.

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