2016-09-08 1 views
0

1> отлично работает в AWS RedShift:разница в Postgres и красным смещением запроса

rep=# \d repdaily 
        Table "prod.repdaily" 
      Column   | Type |  Modifiers  
---------------------------+---------+-------------------- 
timestamp     | integer | not null default 0 


rep=# SELECT distinct trunc(TIMESTAMP 'epoch' + ((floor(timestamp/86400))*86400) *INTERVAL '1 second') as Date_New FROM repdaily limit 1; 
    date_new 
------------ 
2016-06-26 
(1 row) 

rep=# select version(); 
                 version               
-------------------------------------------------------------------------------------------------------------------------- 
PostgreSQL 8.0.2 on i686-pc-linux-gnu, compiled by GCC gcc (GCC) 3.4.2 20041017 (Red Hat 3.4.2-6.fc3), Redshift 1.0.1096 
(1 row) 

rep=# 

2> Я попытался запустить тот же запрос, как в 9.5.4 и 8.0.2:

Я не знаю, как чтобы сделать его общим, чтобы мы могли запускать его где угодно.

rep=# \d repdaily 
        Table "prod.repdaily" 
      Column   | Type |  Modifiers  
---------------------------+---------+-------------------- 
timestamp     | integer | not null default 0 

rep=# 
rep=# SELECT distinct trunc(TIMESTAMP 'epoch' + ((floor(timestamp/86400))*86400) *INTERVAL '1 second') as Date_New FROM repdaily limit 1; 
ERROR: function trunc(timestamp without time zone) does not exist 
LINE 1: SELECT distinct trunc(TIMESTAMP 'epoch' + ((floor(timestamp/... 
         ^
HINT: No function matches the given name and argument types. You might need to add explicit type casts. 
rep=# 

rep=# select version(); 
               version             
---------------------------------------------------------------------------------------------------------- 
PostgreSQL 9.5.4 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.4.7 20120313 (Red Hat 4.4.7-17), 64-bit 
(1 row) 

rep=# 

rep=# select version(); 
                version             
----------------------------------------------------------------------------------------------------------- 
PostgreSQL 8.0.2 on x86_64-unknown-linux-gnu, compiled by GCC gcc (GCC) 4.4.7 20120313 (Red Hat 4.4.7-17) 
(1 row) 

rep=# 
+0

Это 'date_trunc()' в Postgres, а не только 'trunc()' –

ответ

0

PostgreSQL не имеет trunc(timestamp) функцию родной. Глядя на RedShift's trunc(timestamp) function, вы можете увидеть:

Функция также может возвращать дату с отметки времени. Для штампов времени TRUNC возвращает дату.

Так эквивалент для PostgreSQL будет простое приведением к типу DATE:

SELECT distinct 
    CAST(TIMESTAMP 'epoch' + ((floor(timestamp/86400))*86400) *INTERVAL '1 second' AS date) as Date_New 
FROM repdaily limit 1; 

Если вы хотите, вы можете просто создать эту trunc(timestamp) функции в PostgreSQL:

CREATE OR REPLACE FUNCTION trunc(timestamp) 
RETURNS date 
LANGUAGE SQL 
IMMUTABLE AS $$ 
    SELECT $1::date; 
$$; 

сейчас ваш исходный запрос также будет работать в PostgreSQL.

+0

Извините, я был в отпуске и не мог ответить. MatheusOl @ лучший ответ, который я получил, если я не ошибаюсь, и он отлично работает. Большое вам спасибо за помощь !!!! –

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