这是我的问题:
我想计算在数据库中更新记录的时间。
数据库位于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就当前时间达成一致意见的另一种方法也可以!
答案 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默认为其浮动时区。