Отметки времени с разными часовыми поясами в PostgreSQL - PullRequest
3 голосов
/ 07 сентября 2011

Моя задача - архивировать данные через 3, 5, 7 дней.

Я использую PostgreSQL.В некоторых таблицах есть записи с указанием часового пояса, в других - нет.При приведении к дате я получаю разные значения для одинаковых моментов времени.Как мне нормализовать их, чтобы получить согласованные наборы данных в моих архивах?

Даты похожи на «2011-08-01 17: 03: 19 + 05: 30.»

CREATE OR REPLACE FUNCTION archive(tablename text, fieldname text, days integer, archivepath text)
  RETURNS text AS
$BODY$
declare
format_date text;
fileName text;
totalCount integer;
fileNamewithCount text;

stmt text;
BEGIN
format_date:=to_char(localTIMESTAMP,'YYYYmmddhhmmss');

stmt := 'SELECT COUNT(*) FROM '|| tableName ||' WHERE DATE('||fieldName||') < DATE(CURRENT_DATE -'||days ||')';

EXECUTE stmt INTO totalCount;

IF totalCount > 0 THEN
--raise notice 'format_date : %',format_date;
fileName := 'D:/' || '/' || archivepath || '/' || tableName || '_' || format_date ||'.csv';


EXECUTE 'COPY (SELECT * FROM ' || quote_ident(tableName) || ' where date(' || quote_ident(fieldName)||') < date((current_date - integer '''|| days ||''')) limit 100000) TO '''|| fileName ||''' WITH CSV HEADER'; 

EXECUTE 'DELETE FROM ' || quote_ident(tableName) ||' where date(' || quote_ident(fieldName) || ') < date((current_date - integer '''||days ||'''))';

END IF;
fileNamewithCount := totalCount || '--' || fileName ;

RETURN  fileNamewithCount;

EXCEPTION
        WHEN OTHERS THEN RAISE EXCEPTION 'ERROR: % : %.',SQLSTATE,SQLERRM;

END;$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
ALTER FUNCTION archive(text, text, integer, text) OWNER TO postgres;

1 Ответ

2 голосов
/ 21 сентября 2011

Попробуйте это:

SELECT TIMESTAMP '2001-02-16 20:38:40+1' AT TIME ZONE 'UTC';

.. где UTC означает «Всемирное координированное время».Вы можете использовать любое другое название часового пояса или сокращение - прочитайте документы .Для получения списка допустимых сокращений часовых поясов:

SELECT * FROM pg_timezone_abbrevs;  

Напишите ваш запрос так:

SELECT * FROM my_tbl WHERE (my_ts_fld AT TIME ZONE 'UTC')::date = $my_date;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...