Başlıkta da belirtildiği gibi, veri kümelerimden hangilerinin SYSDATE'den 6 ay geçmiş olduğunu sorgu yoluyla kontrol etmenin bir yolunu bulmak istiyorum.
SELECT * FROM OrderArchive
WHERE OrderDate <= '31 Dec 2014';
Aşağıdakileri denedim ancak tarih formatımın yanlış olduğunu söyleyen bir hata döndürüyor. Ancak, verileri eklerken bu tarih biçimini istendiği/amaçlandığı gibi kullandım ve hiçbir sorun yaşamadım.
Komut Satırında Hata : 10 Sütun : 25
Blockquote
Hata raporu -
SQL Hatası: ORA-01861: literal biçim dizesiyle eşleşmiyor 01861. 00000 - "literal biçim dizesiyle eşleşmiyor"
*Neden: Girdideki değişmezler, girdideki değişmezlerle aynı uzunlukta olmalıdır. biçim dizesi (baştaki boşluklar hariç). Eğer "FX" değiştiricisi açılmışsa, değişmez tam olarak eşleşmelidir, fazladan boşluk olmadan.
*Eylem: Biçim dizesini değişmezle eşleşecek şekilde düzeltin.
Sorgu dizeniz bir değişmez olduğundan ve tarihlerinizin DATE
olarak düzgün bir şekilde saklandığını varsayarak date literals kullanmalısınız:
SELECT * FROM OrderArchive
WHERE OrderDate <= DATE '2015-12-31'
Eğer TO_DATE
kullanmak istiyorsanız (örneğin, sorgu değeriniz bir literal olmadığı için), ABD kısaltılmış ay adlarını kullandığınız için NLS_DATE_LANGUAGE parametresini açıkça ayarlamanızı öneririm. Bu şekilde, bazı yerelleştirilmiş Oracle Kurulumlarında bozulmayacaktır:
SELECT * FROM OrderArchive
WHERE OrderDate <= to_date('31 Dec 2014', 'DD MON YYYY',
'NLS_DATE_LANGUAGE = American');
to_date()` fonksiyonunu kullanarak dizeyi tarihe dönüştürmeniz gerekir
SELECT * FROM OrderArchive
WHERE OrderDate <= to_date('31-Dec-2014','DD-MON-YYYY');
VEYA
SELECT * FROM OrderArchive
WHERE OrderDate <= to_date('31 Dec 2014','DD MON YYYY');
VEYA
SELECT * FROM OrderArchive
WHERE OrderDate <= to_date('2014-12-31','yyyy-MM-dd');
Bu yalnızca SiparişTarihi
Tarih biçiminde
depolandığında çalışacaktır. Eğer Varchar
ise, to_date()
fonksiyonunu bu sütuna da uygulamanız gerekir.
SELECT * FROM OrderArchive
WHERE to_date(OrderDate,'yyyy-Mm-dd') <= to_date('2014-12-31','yyyy-MM-dd');