如何使用字符字段的一部分对PostgreSQL表进行分区?

如何使用字符字段的一部分对PostgreSQL表进行分区?,postgresql,partitioning,Postgresql,Partitioning,PostgreSQL 11.4 表foo包含一个字段my_datetime字符(254) 我想使用这个字段对foo进行分区,但只使用字符串的年、月、日部分 值20200328175432 Substr(my_datetime,0,9)为我提供了20200328您需要创建一个函数来克服该软件供应商有问题的(更不用说愚蠢的)设计决策: create function fix_broken_type(p_input text) returns date as $$ select to_date

PostgreSQL 11.4

表foo包含一个字段my_datetime字符(254)

我想使用这个字段对foo进行分区,但只使用字符串的年、月、日部分 值
20200328175432


Substr(my_datetime,0,9)
为我提供了
20200328
您需要创建一个函数来克服该软件供应商有问题的(更不用说愚蠢的)设计决策:

create function fix_broken_type(p_input text)
  returns date
as
$$
  select to_date(p_input, 'yyyymmddhh24miss');
$$
language sql
immutable; --<<< this is important
然后添加分区:

create table data_2020_01_01 partition of data
  for values from ('2020-01-01') TO ('2020-01-02');
当然,如果插入了一个无法用
转换为\u date()
的值,那么这将非常失败


您需要创建一个函数来克服该软件供应商有问题(更不用说愚蠢)的设计决策:

create function fix_broken_type(p_input text)
  returns date
as
$$
  select to_date(p_input, 'yyyymmddhh24miss');
$$
language sql
immutable; --<<< this is important
然后添加分区:

create table data_2020_01_01 partition of data
  for values from ('2020-01-01') TO ('2020-01-02');
当然,如果插入了一个无法用
转换为\u date()
的值,那么这将非常失败


为什么要在
varchar
列中存储
时间戳
。这是一个非常非常糟糕的主意。如果它是适当的
时间戳
,那么对它进行分区就很容易了。“我可以尝试其他方法”-是的,请为数据选择正确的数据类型。我无法更改该列类型(是的,这将是“轻松”按钮)。这是COTS供应商创建时间戳的方式,允许时间戳在分钟、秒和几分之一秒之间。如果我改变它,他们的软件就坏了。如果他们连最基本的设计都做不好,那我就不会信任那个供应商。为什么你要在
varchar
列中存储
timestamp
。这是一个非常非常糟糕的主意。如果它是适当的
时间戳
,那么对它进行分区就很容易了。“我可以尝试其他方法”-是的,请为数据选择正确的数据类型。我无法更改该列类型(是的,这将是“轻松”按钮)。这是COTS供应商创建时间戳的方式,允许时间戳在分钟、秒和几分之一秒之间。如果我改变它,他们的软件就坏了。如果他们连最基本的设计都做不好的话,那就不会给我太多的信任。谢谢你,我现在要投票表决了-我还在想办法让分区只工作一天,而不是整个月谢谢你,我现在要投票表决这个问题——我仍然在想如何使分区只工作一天而不是整个月