2016-07-05 3 views
0

Я столкнулся с столбцом, который содержит даты (хранятся как текст) в двух разных форматах. Использование to_date() требует указания формата, поэтому он будет работать только с некоторыми из них.Преобразование на дату, когда разные форматы в том же столбце

Есть ли способ конвертировать оба формата параллельно с SELECT?

 created_at   | id 
---------------------------+--------- 
2015-08-27 04:59:40 -0400 | 9993833 
2015-08-27T03:40:07+12:00 | 9984557 
2015-08-26 03:04:35 -0400 | 9980626 
2015-08-26T13:11:51+12:00 | 9978784 
2015-08-26T06:18:04+12:00 | 9974751 
2015-08-25 00:21:47 -0400 | 9965448 
2015-08-24T15:01:09+12:00 | 9952732 
2015-08-23 22:47:32 -0400 | 9952671 
2015-08-24T12:49:57+12:00 | 9952099 
2015-08-24T12:04:04+12:00 | 9951839 
2015-08-23T17:49:24+12:00 | 9948236 
2015-08-23T11:37:53+12:00 | 9947015 
2015-08-21 03:13:16 -0400 | 9934367 
2015-08-21T18:36:18+12:00 | 9934148 
2015-08-21T17:23:30+12:00 | 9933522 
2015-08-21T15:33:50+12:00 | 9932949 
2015-08-20 12:06:37 -0400 | 9927425 
2015-08-21T03:16:58+12:00 | 9926932 
+1

Было бы возможно использовать CASE ... КОГДА конструируйте, если postgresql поддерживает его. – Michal

+0

Что вам нужно, только часть даты или вся временная метка? – jarlh

+2

Эти форматы не такие разные, postgresql может автоматически идентифицировать их, просто отбрасывать их в метку времени с часовым поясом, f.ex. 'select created_at :: timestamptz'. – pozs

ответ

0

(Предполагая, что есть только два различных типа форматов даты) Ручка двух форматов по отдельности и комбинируют с использованием UNION ALL.

select to_date(created_at,'format_specifier1') as created_at , id from table 
where created_at NOT Like '%T%' 

UNION ALL 

select to_date(created_at,'format_specifier2') as created_at , id from table 
where created_at Like '%T%' 

так что все, что вам нужно, чтобы выяснить, является строкой спецификатора формата 2. (У меня нет доступа к postgre DB прямо сейчас)

Смежные вопросы