2012-10-30 13 views
27

mam kolumnę o nazwie StartDate zawierający datę w następującym formacie: 03-03-2012 15:22Oracle SQL jak usunąć razem z datą

Co potrzebne jest, aby przekształcić go do tej pory. Należy wygląda tak: DD/MM/YYYY

Co próbowałem bez sukcesu jest:

select 
p1.PA_VALUE as StartDate, 
p2.PA_VALUE as EndDate 
from WP_Work p 
LEFT JOIN PARAMETER p1 on p1.WP_ID=p.WP_ID AND p1.NAME = 'StartDate' 
LEFT JOIN PARAMETER p2 on p2.WP_ID=p.WP_ID AND p2.NAME = 'Date_To' 
WHERE p.TYPE = 'EventManagement2' 
AND TO_DATE(p1.PA_VALUE, 'DD/MM/YYYY') >= TO_DATE('25/10/2012', 'DD/MM/YYYY') 
AND TO_DATE(p2.PA_VALUE, 'DD/MM/YYYY') <= TO_DATE('26/10/2012', 'DD/MM/YYYY') 

Czy istnieje sposób, aby to zrobić?

Edit1: kolumna PA_VALUE jest: VARCHAR2

Odpowiedz

14

Podczas konwertowania ciąg do daty trzeba dopasować datę maski do formatu w ciągu. Obejmuje to element czasu, który trzeba usunąć z obcinania:

select 
p1.PA_VALUE as StartDate, 
p2.PA_VALUE as EndDate 
from WP_Work p 
LEFT JOIN PARAMETER p1 on p1.WP_ID=p.WP_ID AND p1.NAME = 'StartDate' 
LEFT JOIN PARAMETER p2 on p2.WP_ID=p.WP_ID AND p2.NAME = 'Date_To' 
WHERE p.TYPE = 'EventManagement2' 
AND trunc(TO_DATE(p1.PA_VALUE, 'DD-MM-YYYY HH24:MI')) >= TO_DATE('25/10/2012', 'DD/MM/YYYY') 
AND trunc(TO_DATE(p2.PA_VALUE, 'DD-MM-YYYY HH24:MI')) <= TO_DATE('26/10/2012', 'DD/MM/YYYY') 
+0

Ogromne dzięki, zadziałało! :) – Slim

41

Można użyć TRUNC na DateTime do czasu usunięcia część DateTime. Więc gdzie klauzula może być:

AND TRUNC(p1.PA_VALUE) >= TO_DATE('25/10/2012', 'DD/MM/YYYY') 

The TRUNCATE (datetime) function returns date with the time portion of the day truncated to the unit specified by the format model.

+1

tutaj jest to, co mam: ORA-00932: niespójnych typów danych: Przewidywana liczba dostałem DATA 00932. 00000 - „niezgodne typy danych: oczekiwano% s% s got " – Slim

+0

Aby dodać do tego: w Oracle można również użyć [indeksów opartych na funkcjach] (http://www.akadia.com/services/ora_function_based_index_2.html), które mogą przyspieszyć za pomocą TRUNC, lub jakiejkolwiek innej funkcji. .... – ppeterka

+0

Jaki jest typ danych PA_Value? czy to nie DateTime? – Habib

3

Spróbuj

SELECT to_char(p1.PA_VALUE,'DD/MM/YYYY') as StartDate, 
     to_char(p2.PA_VALUE,'DD/MM/YYYY') as EndDate 
    ... 
+0

Ta kwerenda zwraca varchary, a nie daty. –

+0

Data to typ danych, jego wygląd jako ciąg określony przez ustawienia TNS klienta i bazy danych. Ponieważ OP chciał być sformatowany według ustalonego wzorca, jedynym sposobem na to jest konwersja na varchary. Nawiasem mówiąc, OP zredagował swoje pytanie, więc moja odpowiedź nie jest już stosowana. – pavelpopov

0

Możemy wykorzystać funkcję TRUNC w Oracle DB. Oto przykład.

SELECT TRUNC(TO_DATE('01 Jan 2018 08:00:00','DD-MON-YYYY HH24:MI:SS')) FROM DUAL 

wyjściowa: 1/1/2018