2015-02-26 21 views
7
WHERE (ResTRRequest.RequestTime BETWEEN TO_CHAR(TRUNC(TO_DATE('2012-12-01 20:10:10', 'HH')), 'YYYY-MM-DD HH24:MI:SS') 
AND TO_CHAR(TRUNC(CURRENT_TIMESTAMP, 'HH') + INTERVAL '59:59' MINUTE TO SECOND, 'YYYY-MM-DD HH24:MI:SS')) 

Uyguladığım zaman sorgudaki koşulun nerede olduğu, bana verdiğim statik tarih nedeniyle saat 1 ila 12 arasında olması gerektiğini ifade ettim, '' 2012 -12-01 20:10:10 ',' HH ')' sysdate'i iyi çalışıyor ancak statik tarih nedeniyle hata veriyor.ORA-01849: saat 1 ile 12 arasında olmalıdır

cevap

8

en biraz bu yıkmak edelim: Ben belki düşünüyorum TRUNC(TO_DATE('2012-12-01 20:10:10', 'HH')): Bunu söylediğini sanmıyorum, İlk olarak

WHERE (ResTRRequest.RequestTime 
    BETWEEN TO_CHAR(TRUNC(TO_DATE('2012-12-01 20:10:10', 'HH')), 'YYYY-MM-DD HH24:MI:SS') 
    AND TO_CHAR(TRUNC(CURRENT_TIMESTAMP, 'HH') + INTERVAL '59:59' MINUTE TO SECOND, 'YYYY-MM-DD HH24:MI:SS')) 

Bu şu anlama gelir: TRUNC(TO_DATE('2012-12-01 20:10:10'), 'HH'). 1-12 hatası arasındaki sayı, 20 saatinizin olması ve HH maskesini kullanarak bir tarihe dönüştürmeye çalıştığınız gerçeğinden kaynaklanır. Ama dediğim gibi bu bir yazım hatası.

TRUNC(TIMESTAMP'2012-12-01 20:10:10', 'HH') 

İkinci ve sadece, sen dizeleri olarak tarih ve zaman damgalarını depoladığınız yoldan bu olsun: Ayrıca TO_DATE() yerine burada bir TIMESTAMP değişmez kullanabilir? Bu iyi bir fikir değil.

Üçüncü olarak, kenar durumlarını gözden kaçırabileceğiniz için BETWEEN tarih karşılaştırmalarını kullanmak iyi bir fikir değildir. O şöyle bu yeniden yazmak daha iyi olabilir:

WHERE (ResTRRequest.RequestTime >= TO_CHAR(TRUNC(TO_DATE('2012-12-01 20:10:10'), 'HH'), 'YYYY-MM-DD HH24:MI:SS') 
    AND ResTRRequest.RequestTime < TO_CHAR(TRUNC(CURRENT_TIMESTAMP, 'HH') + INTERVAL '1' HOUR, 'YYYY-MM-DD HH24:MI:SS')) 
+0

Teşekkürler David ... Şimdi iyi çalışıyor. – Yogesh

3

Sorun maske içinde:

TO_DATE('2012-12-01 20:10:10', 'HH') 

bu biriyle değiştirin:

TO_DATE('2012-12-01 20:10:10', 'HH24') 
+0

çalışmıyor ... tarih formatı resmi, tüm giriş dizgisini dönüştürmeden önce biter. Zaten – Yogesh

1

ResTRRequest.RequestTime tarih türü olduğunu varsayarsak, bu Where fıkra çalışacaktır:

where ResTRRequest.RequestTime 
BETWEEN TRUNC(TO_DATE('2015-02-26 20:10:10', 'YYYY-MM-DD HH24:MI:SS'), 'HH') 
    AND TRUNC(CURRENT_TIMESTAMP, 'HH') + INTERVAL '59:59' MINUTE TO SECOND 

Karakter gösterimlerini karşılaştırmanız gerekiyorsa, unutmayın ki sözlüksel pare, dizelerin öneklerinin dizelerinden önce sıralandığı anlamına gelir! Azaltıcılık sırasına göre düzenlenmiş, bileşenlerle özdeş biçimleme modellerini kullanarak komplikasyonların oluşmasından kaçının. Örneğin.

TO_CHAR(<whatever>, 'YYYY-MM-DD HH24:MI:SS') 

ancak

TO_CHAR(<whatever>, 'MM/DD/YYYY HH24:MI:SS') 
+0

ile denedim, bu OP'nin kodu verilen güvenli bir varsayım olduğundan emin değilim. ResTRRequest.RequestTime 'DATE' veya 'TIMESTAMP' türündeyse kesinlikle daha iyi olur. –

+0

@DavidFaber İlginizi çekerim. – collapsar

0

Bir şey daha halinde bu hata verileri kendisidir olsun dikkat etmek. Bu format belirtici 'MM/dd/YYYY HH: MI: SS AM' ile ayrıştırmak ve TO_DATE ile dönüştürmek zorunda olduğum xml etiketinde saklandığım tarih var. SQL "ORA-01849: saat 1 ile 12 arasında olmalıdır" diye kırdı çünkü bazı kayıtlar şöyle yazılmıştır: "12/20/2017 16:45:00". 16h ve PM değerlerine dikkat edin ...

İlgili konular