2016-08-25 4 views
1

Я стараюсь, чтобы извлечь год из временной метки в monetdb используяExtract (год с отметкой времени) в MonetDB

select extract(year from ts), ts from orders; 

, но этот запрос, очевидно, возвращает ложный результат:

| year |  ts  | 
---------------------------- 
| 17935405 | 1441695291096 | 
| 18245391 | 1441695601082 | 
| 18331748 | 1441695687439 | 
+0

Какой тип столбца 'ts'? Это просто целое число? – ppeterka

ответ

0

Если тип данных TS столбец - это только временная метка эпохи, миллисекунды от 1970-01-01 00:00:00.000, ее нужно преобразовать во временный тип до того, как будет работать EXTRACT. По this link:

The convert function is called epoch(int) . There is also a new function epoch(timestamp) which returns the number of seconds since epoch.

Как я не могу проверить это, не имея экземпляр MonetDB, я исследовал немного больше, и это, кажется, уродливее, но более вероятно, работать, чтобы получить временную метку времени эпохи (на основании this post):

select TIMESTAMP '1970-01-01 00:00:00' + interval CAST(ts/1000 AS STRING) seconds from orders; 

Так что, если это работает, полное решение будет что-то вроде

select EXTRACT(YEAR from (TIMESTAMP '1970-01-01 00:00:00' + interval CAST(ts/1000 AS STRING) seconds)) from orders; 

Примечание: синтаксис, скорее всего, далеко, как у меня нет экземпляра MonetDB, чтобы проверить с

Edit: добавил CAST (... как STRING), согласно this link Я надеюсь, что это делает работу с арифметикой как ts/1000 без проблем ...

+0

Спасибо за ваш ответ, но он не работает в MonetDb. Я получил следующую ошибку: синтаксическая ошибка, неожиданный IDENT, ожидающий SCOLON в: «select timestamp» 1970-01-01 00:00:00 «+ interval ts» –

+0

Кажется, что ts должен быть String, но не bigint. –

+0

@AnastasiaOsintseva Я добавил в ответ ответ, не могли бы вы взглянуть на него? У меня все еще нет экземпляра MonetDB, чтобы проверить - так что я не уверен, что синтаксис на самом деле прав. Однако, по внешнему виду, я уверен, что должен быть лучший способ сделать это: нужно преобразовать материал в строки и обратно - это далеко не эффективно ... – ppeterka

0

Следующие будут работать.

select extract(year from (TIMESTAMP '1970-01-01 00:00:00' + CAST(1441695291096/1000 AS STRING))); 

... возвращается:

2015 

... и это:

select extract(year from (TIMESTAMP '1970-01-01 00:00:00' + CAST(1481767624000/1000 AS STRING))); 

... возвращает:

2016 

Таким образом, для вашего запроса:

select extract(year from ts), ts from orders; 

... попробовать:

select extract(year from (TIMESTAMP '1970-01-01 00:00:00' + CAST(ts/1000 AS STRING))) as "Year" from orders; 

... и он должен работать.