SQL Server konwertuje literał literału, który przechodzisz ('1/1/1900'
) na wartość datetime z powodu data type precedence (since datetime has higher precedence than string types). Jeśli przekażesz nieprawidłową datę jako ciąg znaków, np. '2/31/1900'
, otrzymasz błąd konwersji (Msg 242
), ponieważ SQL Server nie wie, co oznacza 31 lutego. Nie próbuje dopasować ciąg, który wygląda tak, jak to, co przechodzisz, konwertuje zarówno do wewnętrznej reprezentacji dat (więcej na temat w moim komentarzu).
Gdy mamy do czynienia z datami konkretnie, przestać myśleć o formaciewyjątkiem tego, że kiedy przechodzą literały ciągów, m/d/y
(lub jest to, że d/m/y
?) Jest straszny Format użyć. Znacznie bezpieczniejsze w użyciu:
YYYYMMDD
Zapytanie powinno brzmieć:
SELECT CASE When EndDate = '19000101'
THEN NULL ELSE EndDate END, ...other columns...
FROM dbo.Members;
W ten sposób, kiedy przechodzą datę jak 8 września, nie jest źle interpretowane przez SQL Server, innych czytelników, itp Czy 09/08/2013
8 września lub 9 sierpnia? Zależy od tego, w której części świata się znajdujesz, prawda? W twoim przypadku jest to w porządku, ponieważ dzień i miesiąc są takie same, ale nie zawsze tak będzie. Zobacz następujący artykuł:
http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/16/bad-habits-to-kick-mishandling-date-range-queries.aspx
(. Proszę, proszę, proszę przeczytać, że odnośnik w całości)
Wreszcie, jeśli używasz DATETIME/SMALLDATETIME
i szukasz wartości z określonego dnia, nie powinieneś używać w ogóle równości, ale raczej zapytania zakresu. Na przykład, aby znaleźć wszystkie wiersze gdzie EndDate
przypada na 15 kwietnia 2013 roku, niezależnie od czasu, można by powiedzieć: (. Read this link to understand why you don't want to use BETWEEN
here)
WHERE EndDate >= '20130415'
AND EndDate < '20130416'
Jeśli jesteś na SQL Server 2008 lub lepsza, nadal można uzyskać sargability na tej kolumnie z CONVERT
, ale jest to rzadki wyjątek - zazwyczaj nie chcesz używać funkcji przeciwko kolumnie.
WHERE CONVERT(DATE, EndDate) = '20130415'
Kilka innych uwag - nie są bezpośrednio związane z danym pytaniem, ale peryferyjne obserwacje o kodzie:
- Always use the schema prefix
- Never use
SELECT *
in production
Spójrz na 'funkcji DATEPART'. Zobacz http://msdn.microsoft.com/en-us/library/aa258265(v=sql.80).aspx –
@ PM77-1 czy przeczytałeś pytanie? –
Cóż ... zrobiłem. Popełniłem błąd. Oznacz to 'CONVERT'. –