2012-03-12 5 views
1

La colonne est définie comme VARCHAR. Les données de cette colonne:Conversion de char-date-char

2012-03-11 12:10:00.0 IST

Je veux seulement obtenir la partie date.
Quelle est la meilleure façon de le faire?

je me suis lassé de le convertir à ce jour:

to_char(to_date('2012-03-11 12:10:00.0 IST', 'YYYY-MM-DD'),'YYYY-MM-DD')

mais nous avons eu une erreur: image de format de date se termine avant de convertir la chaîne d'entrée entière

+4

Pourquoi avez-vous des données date/heure dans une colonne varchar? Pourquoi n'avez-vous pas une colonne datetime à la place? –

+0

Cela se termine, votre colonne varchar2 ne s'arrête pas à 'DD', voir http://www.techonthenet.com/oracle/functions/to_date.php – Ben

+1

@kenny - Quelle' DATE' voulez-vous? Puisqu'un Oracle 'DATE' n'a ni fuseau horaire ni fraction de secondes, voulez-vous ignorer les deux lorsque vous convertissez les données en' DATE'? Ou voulez-vous convertir l'heure en fuseau horaire standard (par exemple, GMT/UTC)? Êtes-vous sûr de ne pas vouloir convertir la chaîne en TIMESTAMP WITH TIME ZONE qui prend en charge les secondes fractionnées et un fuseau horaire? –

Répondre

5

Mise à jour: Si je vous ai droit, vous ne souhaitez que la date partie mais pas convertir à ce jour? faire alors ceci:

select SUBSTR('2012-03-11 12:10:00.0 IST', 1, 10) 

Si vous voulez aussi le convertir à jour faites ceci:

select to_date(SUBSTR('2012-03-11 12:10:00.0 IST', 1, 10)) 
+0

-1, l'OP a la bonne idée, convertir en une date d'abord. Vous faites effectivement la conversion de date avec des outils de char. – Ben

+2

+1 Étant donné un format datetime constant dans la chaîne d'origine, c'est le moyen le plus simple de le convertir ** à partir d'une chaîne **. –

+1

@MarkBannister, c'est aussi le plus susceptible d'échouer en silence et le plus susceptible de vous donner le mauvais résultat. Oui, s'il s'agit d'un format de date_constant, alors cela fonctionnera, mais cela est stocké comme un varchar et je ne crois pas que les pièges potentiels valent pour environ 20 caractères de code et une microseconde ou deux. – Ben

1

d juergen est bon et peut être le plus rapide. Cependant, vous pouvez le faire de cette façon aussi:
select cast(to_timestamp('2012-03-11 12:10:00.0 IST', 'YYYY-MM-DD HH24:MI:SS.FF1 "IST"') as date) from dual;