2011-07-19 45 views
56

Böyle sql şey var:Oracle DateTime?

SELECT EMP_NAME, DEPT 
FROM EMPLOYEE 
WHERE TIME_CREATED >= TO_DATE('26/JAN/2011','dd/mon/yyyy') 

-> Bu 10 satırları döndürür ve TIME_CREATED = '26 -OCA 2011'

Şimdi

ne zaman bunu yapmak geri satırları alamadım,

SELECT EMP_NAME, DEPT 
    FROM EMPLOYEE 
    WHERE TIME_CREATED = TO_DATE('26/JAN/2011','dd/mon/yyyy') 

-> neden daha

üzerinden daha Herhangi bir neden aldı?

+3

Sen dil bağımlı tarih biçimleri kaçınmalıdır. Bu farklı sistemlerde sorun yaratabilir. Kodunuzun herhangi bir sistemde sorunsuz çalıştığından emin olmak için 'JAN' yerine (01) '01' yerine kullanmalısınız. –

cevap

108

Evet: TIME_CREATED, bir tarih ve zamanı içerir. zaman şerit TRUNC kullanın:

SELECT EMP_NAME, DEPT 
FROM EMPLOYEE 
WHERE TRUNC(TIME_CREATED) = TO_DATE('26/JAN/2011','dd/mon/yyyy') 

GÜNCELLEME: Dave Costa aşağıda yorumunda belirttiği gibi
, bu sütunda TIME_CREATED varsa dizinini kullanmasını Oracle engelleyecektir. Bu sorun olmadan alternatif bir yaklaşım şudur: Oracle bir DATE sütun da bir zaman parçasını içerdiği için

SELECT EMP_NAME, DEPT 
FROM EMPLOYEE 
WHERE TIME_CREATED >= TO_DATE('26/JAN/2011','dd/mon/yyyy') 
     AND TIME_CREATED < TO_DATE('26/JAN/2011','dd/mon/yyyy') + 1 
+13

Bu yaklaşımın, varsa, TIME_CREATED tarihinde bir dizin kullanımını önleyeceğini unutmayın. –

+0

@Dave: Bu işaretçi için teşekkürler. Cevabımı güncelledim. –

+0

Çözümü gönderdiğiniz için teşekkür ederiz. Bulmak hızlı ve kolaydı. Ingres, MS-SQL, MS-Access ve DB2 gibi diğer DBMS üzerinde çalışırken, şu andaki atamadan önce Oracle ile çalışmadım. –

6

budur. to_date() işlevinin sonucu, saat 00:00:00 olarak ayarlanmış bir tarihtir ve bu nedenle muhtemelen tablodaki herhangi bir satırla eşleşmez.

Sen kullanmalıdır: Başkalarının kullanılarak yukarıda yorumladı

SELECT EMP_NAME, DEPT 
FROM EMPLOYEE 
WHERE trunc(TIME_CREATED) = TO_DATE('26/JAN/2011','dd/mon/yyyy') 
3

olarak (TIME_CREATED tarihinde bir dizin varsa) TRUNC index kullanacaktır engelleyecektir. Bu problemi önlemek için, sorgu 1 saniye daha az bir gün içinde saniye sayısı daha olmak

SELECT EMP_NAME, DEPT 
FROM EMPLOYEE 
WHERE TIME_CREATED BETWEEN TO_DATE('26/JAN/2011','dd/mon/yyyy') 
      AND TO_DATE('26/JAN/2011','dd/mon/yyyy') + INTERVAL '86399' second; 

86399 olarak yapılandırılmış olabilir.

15

Ayrıca sorguda ZAMAN bölümünü kapsayacak şekilde aşağıdaki kullanabilirsiniz:

SELECT EMP_NAME 
    , DEPT 
    FROM EMPLOYEE 
WHERE TIME_CREATED >= TO_DATE('26/JAN/2011 00:00:00', 'dd/mon/yyyy HH24:MI:SS'); 
1

Ayrıca yapabilirdi:

SELECT EMP_NAME, DEPT 
FROM EMPLOYEE 
WHERE TRUNC(TIME_CREATED) = DATE '2011-01-26'