SQL server format daty w zapytaniu

SQL server format daty w zapytaniu
AD
  • Rejestracja:około 14 lat
  • Ostatnio:4 miesiące
  • Postów:85
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.

abrakadaber
abrakadaber
  • Rejestracja:ponad 12 lat
  • Ostatnio:8 miesięcy
  • Postów:6610
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


Chcesz pomocy - pokaż kod - abrakadabra źle działa z techniką.
VA
  • Rejestracja:prawie 12 lat
  • Ostatnio:prawie 12 lat
  • Postów:4
0

Witam,

Znalazłem inne rozwiązanie:

Kopiuj
SET DATEFORMAT dmy

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

Kopiuj
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

edytowany 2x, ostatnio: Vasterlax
crowa
  • Rejestracja:ponad 18 lat
  • Ostatnio:około 8 lat
  • Lokalizacja:Poznań
  • Postów:295
2

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

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

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

nastapi niejawna konwersja typu string do datetime.


Tomasz Andrzejewski
Delphi (XE3-XE7) framework engineer @ InterLan
MCP: Microsoft SQL Server 2008, Implementation and Maintenance
AD
  • Rejestracja:około 14 lat
  • Ostatnio:4 miesiące
  • Postów:85
0

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

crowa
  • Rejestracja:ponad 18 lat
  • Ostatnio:około 8 lat
  • Lokalizacja:Poznań
  • Postów:295
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 HH:MM:SS'


Tomasz Andrzejewski
Delphi (XE3-XE7) framework engineer @ InterLan
MCP: Microsoft SQL Server 2008, Implementation and Maintenance
AD
  • Rejestracja:około 14 lat
  • Ostatnio:4 miesiące
  • Postów:85
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?

crowa
  • Rejestracja:ponad 18 lat
  • Ostatnio:około 8 lat
  • Lokalizacja:Poznań
  • Postów:295
0

tak - konkretne pisanie kodu sql

Kopiuj
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.

Kopiuj
select * from Tabela where MojePOle1 > :Param1

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

Tomasz Andrzejewski
Delphi (XE3-XE7) framework engineer @ InterLan
MCP: Microsoft SQL Server 2008, Implementation and Maintenance
AD
  • Rejestracja:około 14 lat
  • Ostatnio:4 miesiące
  • Postów:85
0

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

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.