Mam tabelę z datami, które wydarzyły się w miesiącu listopadzie. Napisałem to zapytanie
select id,numbers_from,created_date,amount_numbers,SMS_text
from Test_Table
where
created_date <= '2013-04-12'
To zapytanie powinno zwrócić wszystko, co wydarzyło się w miesiącu 11 (listopad), ponieważ wydarzyło się to przed datą „2013-04-12” (w grudniu)
Ale to powrót tylko wolne terminy, które miały miejsce w dniach mniejsza niż 04 (2013- 04 -12)
Czy to możliwe, że porównuje tylko część dzienną? a nie cała randka?
Jak to naprawić?
Created_date jest typu date
Format daty to domyślnie rrrr-dd-MM
sql
sql-server
date
compare
HelpASisterOut
źródło
źródło
2013-04-12
? jest 12 kwietnia? A możecreated_date
to string, a nie data?Odpowiedzi:
Zamiast „2013-04-12”, którego znaczenie zależy od lokalnej kultury, użyj „20130412”, który jest rozpoznawany jako niezmienny format kultury.
Jeśli chcesz porównać dane z 4 grudnia , wpisz „20131204”. Jeśli chcesz porównać z 12 kwietnia th , należy napisać „20130412”.
Artykuł Write International Transact-SQL Statements z dokumentacji SQL Server wyjaśnia, jak pisać instrukcje, które są niezmienne kulturowo:
EDYTOWAĆ
Ponieważ używasz ADO, najlepszą opcją jest sparametryzowanie zapytania i przekazanie wartości daty jako parametru daty. W ten sposób całkowicie unikniesz problemu z formatem i uzyskasz korzyści z wydajności również sparametryzowanych zapytań.
AKTUALIZACJA
Aby użyć formatu ISO 8601 w literale, należy określić wszystkie elementy. Cytując z sekcji ISO 8601 dokumentacji datetime
źródło
To use the ISO 8601 format, you must specify each element in the format. This also includes the T
.YYYY-MM-DD
jest rozpoznawany jako ISO 8601. Wymagane są części czasowe . Nazwij to dziwnością T-SQL, jeśli chcesz, lub niepełną implementacją. Może się nawet zdarzyć, że zostało to przeniesione z SybaseSpróbuj w ten sposób
select id,numbers_from,created_date,amount_numbers,SMS_text from Test_Table where created_date <= '2013-12-04'
źródło
W przypadku porównywania tylko z datą vale, a następnie przekształcenie go do tej pory (nie datetime ) będzie działać
select id,numbers_from,created_date,amount_numbers,SMS_text from Test_Table where created_date <= convert(date,'2013-04-12',102)
Ta konwersja jest również zastosowanie w użyciu GetDate () funkcji
źródło
Położysz
<=
i złapie podaną datę. Możesz go zastąpić<
tylko.źródło
spróbuj z poniższym zapytaniem
select id,numbers_from,created_date,amount_numbers,SMS_text from Test_Table where convert(datetime, convert(varchar(10), created_date, 102)) <= convert(datetime,'2013-04-12')
źródło
Format daty to rrrr-mm-dd. Więc powyższe zapytanie szuka rekordów starszych niż 12 kwietnia 2013
Zaproponuj szybkie sprawdzenie, ustawiając ciąg daty na „2013-04-30”, jeśli nie ma błędu sql, format daty zostanie potwierdzony na rrrr-mm-dd.
źródło
Spróbuj użyć znaku „#” przed i po dacie i upewnij się, jaki jest format daty w systemie. może "RRRRMMDD O RRRR-MM-DD O MM-DD-RRRR O USING '/ O \'"
Dawny:
select id,numbers_from,created_date,amount_numbers,SMS_text from Test_Table where created_date <= #2013-04-12#
źródło