如何在Postgres / Postgis中使用类型(并使用sequelizejs)

时间:2017-07-15 14:42:26

标签: postgresql casting sequelize.js

我在postgis中有矢量图块。没有铸造类型的经验。 vector-tile-spec支持以下类型:string,float,double,int64,uint64,sint64,bool。这意味着除了Varchar,Text,CharArray,Float4,Float8,Int2,Int4,Int8,Bool之外的所有PostgreSQL类型都必须转换为其中之一。

我的表中有两个字段是DATES,即'带时区的时间戳':createdAt和updatedAt。我想以支持的类型存储,那么我该怎么做呢?

我目前:

  1. 使用sequelize制作架构(a.o.定义DATE类型)
  2. 使用ogr2​​ogr进行批量导入(其中Postgis创建默认值 (日期)
  3. 之后和那个带有sequelize的CRUD。
  4. 但是所有3(或至少2和3)都需要以支持的类型结束。

    • 哪种类型可以最好地投射我的日期?
    • 我该怎么做(使用sequelize hooks?使用Postgres?)?

1 个答案:

答案 0 :(得分:0)

我会将您的日期投放到INTEGERBIGINT,具体取决于您需要使用的日期范围,并且只计算Unix Time的天数。

假设您刚刚投放到INTEGER,您可以定义以下函数,以便从dates转换为纪元日期的天数(1970-01-01 00:00:00 ):

CREATE FUNCTION days_from_reference_date(d date)
RETURNS INTEGER
AS
$$
    SELECT
        CAST(EXTRACT(epoch from d) / (60 * 60 * 24 /* seconds in a day */) AS INTEGER) ;
$$
LANGUAGE SQL
STRICT
IMMUTABLE ;

您可以在类似这样的场景中使用它:

SELECT
    days_from_reference_date(d) AS transformed_date
FROM
    dates
ORDER BY
    transformed_date ;

可以通过以下方式完成反向转换:

CREATE FUNCTION date_from_days_from_reference_date(days integer)
RETURNS date
AS
$$
    SELECT CAST(to_timestamp(cast(days as bigint) * 60 * 60 * 24) AS date);
$$
LANGUAGE SQL
STRICT
IMMUTABLE ;

您可以在 dbfiddle here

查看几个示例

参考文献:

警告:抵消一天,日期为BC;如果你需要它们。它可以通过在反向转换函数中检查它们来解决。