Perl DBIx :: Class:从数据库中获取当前时间

时间:2017-03-23 13:08:18

标签: postgresql perl dbix-class

这是我的问题:

我想计算在数据库中更新记录的时间。

数据库位于PostgreSQL中,update_time字段由使用CURRENT_TIMESTAMP(2)的触发器填充。该字段由DBIx :: Class扩展为DateTime对象。我使用DateTime->now()

在代码中获取当前时间

我的问题是,当我检索字段值时,它会关闭1小时(即它在DateTime->now()之前1小时)。我现在在CET时区,所以在UTC之前1小时。

解决问题的正确方法可能在数据库级别。我试图将CURRENT_TIMESTAMP替换为LOCALTIMESTAMP,但无济于事。

我认为实际上更强大的解决方案(即不依赖于正确获取数据库的解决方案)将是从数据库本身获取当前时间戳。我真的只需要这个时代,因为我用它来计算差异。

所以问题是:是否有一种简单的方法:使用DBIx :: Class从数据库获取当前时间?

让DB和DateTime就当前时间达成一致意见的另一种方法也可以!

2 个答案:

答案 0 :(得分:2)

您可以使用dbh_do from your DBIx::Class::Storage运行任意查询。有了这个,只需SELECT CURRENT_TIMESTAMP

my ( $timestamp ) = $schema->storage->dbh_do(
  sub {
    my ($storage, $dbh) = @_;

    $dbh->selectrow_array("SELECT CURRENT_TIMESTAMP");
  },
);

答案 1 :(得分:1)

我总是建议在应用服务器上执行所有与日期/时间相关的事情,而不是依赖数据库服务器。本质上,这意味着不使用触发器,但在插入/更新时传递日期时间并使其成为必需(NOT NULL)。 除此之外,您应该以UTC格式存储日期时间并转换为代码中的本地或其他所需时区。 您的问题可能是因为时区配置不正确或缺失,在这种情况下,DateTime默认为其浮动时区。