我的故事来自this:
我使用Table_Year_Month格式创建了一个函数create dynamic partition table,例如table_2018_04,table_2018_05 ....创建分区函数的参数是bigint
,例如create_partition_function(1518164237,1520583437) ;
。之后,我将bigint转换为日期,以便从时间戳中获得 year
和 month
。但检查功能( check(timestamp >= date))
不起作用
我无法在sql中比较bigint
> = date
。什么操作员可以比较他们的?
我尝试将时间戳转换为带有UNIX_TIMESTAMP
sql函数的datetime但不起作用
CREATE OR REPLACE FUNCTION create_partition_function( DATE, DATE )
returns void AS $$
DECLARE
create_query text;
index_query text;
BEGIN
FOR create_query, index_query IN SELECT
'create table user_event_firebase_'
|| TO_CHAR( d, 'YYYY_MM' )
|| ' ( check( timestamp >= UNIX_TIMESTAMP(date,'%Y %M %D' )'''
|| TO_CHAR( d, 'YYYY-MM-DD' )
|| ''' and timestamp < UNIX_TIMESTAMP(date,'%Y %M %D' ) '''
|| TO_CHAR( d + INTERVAL '1 month', 'YYYY-MM-DD' )
|| ''' ) ) inherits ( user_event_firebase );',
'create index user_event_firebase_'
|| TO_CHAR( d, 'YYYY_MM' )
|| '_time on user_event_firebase_'
|| TO_CHAR( d, 'YYYY_MM' )
|| ' ( timestamp );'
FROM generate_series( to_timestamp($1), to_timestamp($2), '1 month'::interval ) AS d
LOOP
EXECUTE create_query;
EXECUTE index_query;
END LOOP;
END;
$$
language plpgsql;
p / s:bigint
和date
是sql中的数据类型。
ERROR: invalid input syntax for integer: "2018-02-09"
CONTEXT: SQL statement "create table user_event_firebase_2018_02 ( check( timestamp >= bigint '2018-02-09' and timestamp < bigint '2018-03-09' ) ) inherits ( user_event_firebase );"
PL/pgSQL function create_partition_function(date,date) line 21 at EXECUTE
答案 0 :(得分:3)
您可以使用
将日期/时间戳转换为秒SELECT extract(epoch from '2016-05-03'::date)
--result: 1462233600
SELECT to_timestamp(1462233600)::date;
--result: '2016-05-03'