2016-04-19 8 views
7

Całkowicie przez przypadek dzisiaj biegałam instrukcji SQL do filtrowania niektórych elementów według daty, dla uproszczenia powiemy użyłemjaki sposób operator> + różni się od> = w SQL Server 2012

SELECT * 
FROM [TableName] 
WHERE [RecordCreated] >+ '2016-04-10' 

Dopiero po uruchomieniu stwierdziłem, że użyłem> + zamiast> =, teraz byłem zdezorientowany, ponieważ oczekiwałbym błędu.

Próbowałem kilka innych odmian takich jak

>- -- Throws an error 
<+ -- Ran successfully 
<- -- Throws an error 

Ilość wierszy zwrócony był dokładnie taki sam, czy użyłem> = lub> +

Po szukają w internecie nie mogłem znaleźć żadnego dokumentacja, która dotyczy bezpośrednio tej składni, tylko wtedy, gdy dwa operatory są używane oddzielnie.

Kolumna RecordCreated to datetime.

Czy jest to po prostu świetna składnia dla możliwej wspólnej pomyłki, czy też potencjalnie próbuje podać datę jako wartość liczbową?

+3

interesujące. Spodziewam się tego analizować przy użyciu '' + jako operator jednoargumentowy (https://msdn.microsoft. com/en-us/library/ms174362.aspx), ale jestem zaskoczony, że działa na literał ciągu/daty. –

+5

To nie jest operator. To dwaj operatorzy obok siebie. Otrzymasz różne wyniki, jeśli istnieją wiersze z 'RecordCreated' dokładnie równe' 2016-04-10'. –

+2

Jest to błąd w analizatorze składni lub błąd w dokumentacji. 'SELECT + 'plus!'' Daje 'plus!', Mimo że na wszystkich kontach nie powinno, ponieważ jednoargumentowy plus rzekomo działa tylko na typy liczbowe, a operator konkatenacji ciągów wymaga innego wyrażenia. (Ponieważ ciąg pozostaje łańcuchem, nie jest to jeden z przypadków, w których fetysz T-SQL dotyczący niejawnych konwersji jest problemem.) –

Odpowiedz

-2

Wynik nie powinien być zgodny z "> =" i "< =" ale z ">" i "<". Właśnie sprawdziłem, a liczba wierszy różni się o 2 - usunięto pierwszy i ostatni element.

+0

Właśnie próbowałem twojego przykładu, a liczba jest taka sama dla>,> + i> =, myślę, że @Damien_The_Unbeliever mówi, że może się zmienić, jeśli był rekord dokładnie dopasowany, jeszcze nie spróbowałem tego testu. – samuelmr

+0

OK, byłoby interesujące wiedzieć. Próbowałem po prostu na "standardowej" tabeli wymiaru daty i filtrowałem według daty ... i jak wspomniano, pierwsza i ostatnia data zostały pominięte, gdy użyłem> + i <+ – Tyron78

+0

Kiedy podałem datę, która byłaby dokładna match '2016-04-11 09: 27: 51.217' liczba różniła się o 1 między> = i> +, wykazując, że> + ignoruje dokładne dopasowania. Nie wygląda jednak na ostatni rząd. – samuelmr

1

Wygląda na to, że jest to błąd z operatorem "+".

Zgodnie aktualizacje z zespołu Microsoft

Po pewnym dochodzenia, to zachowanie jest zgodne z projektem od + jest operator jednoargumentowy. Tak więc parser akceptuje "+, a" + "jest po prostu ignorowane w tym przypadku. Zmiana tego zachowania ma wiele z konsekwencji kompatybilności wstecznej, więc nie mamy zamiaru go zmieniać & poprawka wprowadzi niepotrzebne zmiany kodu aplikacji .

można znaleźć naprawdę dobrą odpowiedź przez RGO do swojego pytania here.

Powiązane problemy