SQL для извлечения даты Matlab из Postgres DB - PullRequest
0 голосов
/ 09 февраля 2010

Я хотел бы создать запрос для "преобразования" даты-времени postgresql в дату-дату matlab.Опыт работы с другими БД показал, что преобразование даты на стороне БД на намного быстрее, чем в Matlab.

Matlab хранит даты как количество дней (включая дроби) с произвольнойэпоха григорианской несуществующей даты 00-00-0000.

В Oracle это просто, потому что Oracle хранит даты внутри, как это делает Matlab, но с другой эпохой.

select (date_column_name - to_date('01-Jan-0001') + 365) ...

Прямое преобразование этого в синтаксис PG не работает:

select (date_column_name - date '01-Jan-0001' + interval 365) ...

Я начал с определенного дня в matlab, для тестирования:

>> num2str(datenum('2010-10-02 12:00'))

ans =

734413.5

Я был в и из pg docs весь день, extract ing epoch s и second s, и т. Д. И я приблизился.В основном это получает секунды в интервале, который я просто делю на секунды в дне:

Select cast(extract(epoch from (timestamp '2010-10-02 12:00' 
                               - timestamp '0000-01-01 23:10'
                               + interval '2 day'
                               )
                   ) as real
           )/(3600.0*24.0)  AS MDate

answer: 734413.51111111111

Но это демонстрирует некоторое странное поведение.Корректировка минут из метки времени эпохи не меняет ответ, за исключением одной конкретной минуты - т.е. 23:09 - это один ответ, 23:10 - другой, и он остается неизменным с 23:10 до 23:59.(другие часы имеют похожее поведение, хотя конкретная «минута» отличается.)

Есть идеи?Может быть, по-другому сделать это?

edit: использование 8.4.2

Ответы [ 2 ]

1 голос
/ 09 февраля 2010

Ну, извлечение (эпоха из t :: timestamp) даст секунды с эпохи UNIX (01 января 1970 г.) и выдаст 1286017200 для '2010-10-02 12:00:00'.

Matlab дает 734413,5 для того же момента времени, но это в днях - 63453326400 секунд, смещение 62167309200.

Таким образом, чтобы преобразовать время эпохи postgres в matlab datenum, мы должны просто добавить это смещение и преобразовать обратно в дни.

steve=# select (extract(epoch from '2010-10-02 12:00:00'::timestamp) + 62167309200) / (24*3600);
 ?column? 
----------
 734413.5
(1 row)
0 голосов
/ 09 февраля 2010

Похоже, что актерский состав был проблемой.

Select extract(epoch from (timestamp '2010-10-02 12:00:01' 
       - timestamp '0000-01-01 00:00' 
       + interval '1 day'))/(3600.0*24.0)

работает как чемпион.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...