Laravel 5.4 支持TIMESTAMP WITH TIME ZONE迁移中的 Postgres字段类型:
$table->timestampTz('scheduled_for');
Run Code Online (Sandbox Code Playgroud)
Laravel 可以设置为将日期字段 ( DATE, DATETIME, TIMESTAMP) 转换为 Carbon 对象(默认情况下为created_at和updated_at TIMESTAMP字段这样做),但放入scheduled_for该$dates字段会导致时区感知版本出错:
InvalidArgumentException with message 'Trailing data'
Run Code Online (Sandbox Code Playgroud)
查看数据库和修补程序,该字段的值似乎类似于2017-06-19 19:19:19-04. 是否有一种本地方法可以从这些字段类型之一中获取 Carbon 对象?还是我一直在使用访问器?
我有一个类型为 nullable 的列timestamp without time zone。它以以下格式存储在我的 Postgres 数据库中:2021-06-24 11:00:00. 我想将其转换为可为空的timestamp with time zone类型,以便将其显示为2021-06-24 11:00:00.000-00. 请注意,没有时区转换。
该解决方案还应该允许从 转换timestamp with time zone为timestamp without time zone。我做了一些研究,但没有找到任何东西。
我xts在索引为POSIXct和时区为GMT 的对象中有一堆1分钟的返回.回报是在纽约证券交易所,所以我想转换到东部时区,但我想妥善照顾夏令时.这样做的最佳方式是什么?我在EST时区和EDT时区之间有点困惑.我想在冬季和夏季将我的时间恰当地转换为纽约时报.
我正在从posgresql数据库中选择一个timestamptz.我希望我的选择只返回日期,小时和分钟.没有秒.我可以在psql select中设置日期格式以适应这种情况吗?
我正在尝试创建以下视图:
CREATE OR REPLACE VIEW view_events AS
(
SELECT
"rank"() OVER (PARTITION BY "tb1"."innerid" ORDER BY "tb1"."date" ASC) "r"
, "tb2"."opcode"
, "tb1"."innerid"
, "tb1"."date"
, From_iso8601_timestamp(tb1.date) as "real_date"
, "tb2"."eventtype"
, "tb1"."fuelused"
, "tb1"."mileage"
, "tb1"."latitude"
, "tb1"."longitude"
FROM
rt_message_header tb1
, rt_messages tb2
WHERE ((("tb1"."uuid" = "tb2"."header_uuid") AND ("tb2"."opcode" = '39')) AND ("tb2"."type" = 'event'))
ORDER BY "tb1"."innerid" ASC, "tb1"."date" ASC
)
Run Code Online (Sandbox Code Playgroud)
它给了我以下错误:
您的查询具有以下错误:不支持的配置单元类型:带有时区的时间戳
但是,当我自己运行查询时,它可以正常工作,并且在这里提到From_iso8601_timestamp 作为有效的日期函数。
谁能告诉我我在做什么错?
我只是不太了解在以下示例中应该使用这两个中的哪一个:
我们有OfferEntity一个成员availableDay,该成员是要约可用的日期。
现在,该表将如下所示:
CREATE TABLE IF NOT EXISTS offer (
created timestamp with time zone NOT NULL DEFAULT NOW(),
id BIGSERIAL PRIMARY KEY,
available timestamp with time zone
);
Run Code Online (Sandbox Code Playgroud)
从PostgreSQL文档中我们知道:
对于
timestamp with time zone,内部存储的值始终以UTC(通用协调时间,通常称为格林威治标准时间,GMT)表示。使用该时区的适当偏移量,将指定了明确时区的输入值转换为UTC。如果在输入字符串中未指定时区,则假定该时区位于系统TimeZone参数指示的时区中,并使用时区的偏移量将其转换为UTC。
这意味着在保留任何日期/时间信息时我应该没问题。
但这对我OfferEntity和我定义的REST端点意味着什么OfferController?
@Entity
@Table(name = "offer")
public class OfferEntity {
@Column(name = "available", nullable = false)
private ZonedDateTime availableDay;
}
Run Code Online (Sandbox Code Playgroud)
与
@Entity
@Table(name = "offer")
public class OfferEntity {
@Column(name = "available", …Run Code Online (Sandbox Code Playgroud) postgresql utc timestamp-with-timezone zoneddatetime java.time.instant
PostgreSQL 文档相当详尽且有用:
https://www.postgresql.org/docs/9.2/datatype-datetime.html#DATATYPE-TIMEZONES
但似乎忽略了一个相当有用的点的清晰度,在这个点上清晰度可能是必要的和有帮助的。阅读了文档和各种相关的 stackoverflow 问题和回复后,我怀疑以下情况是正确的:
PostgreSQL 数据类型
timestamp with timezone存储日期和时间以及 utcoffset(+ve 在格林威治以东)
我会进一步推断并怀疑这是真的:
PostgreSQL 数据类型
timestamp with timezone将日期和时间以及 utcoffset(+ve 在格林威治以东)存储到分钟分辨率。
我的问题与这些推论有关。它们是否正确,如果正确,可以转发哪些证据来证实它们,如果不正确,可以转发哪些相反的证据。
这很有趣的主要原因当然是因为如果为真,那么接受表中pg_timezone_names存储的名称或缩写的时区的 PostgreSQL只存储 UTC 偏移量,从而丢失 DST 信息。
意思是,为了使实际时区名称(如表中定义的pg_timezone_names)将来可供读者使用,它必须与旁边的timestamp with timezone列显式存储在一起。
我现在感兴趣的主要原因是我想到了一种相当聪明的渲染时间方式,可以记录地球上任何地方的事件时间。即如果记录的时间在用户当前时区,则将其报告为一个简单的日期/时间(没有时区信息),并且只有当它在与读者不同的时区中时,才报告时区信息(即使如此,时区名称可能比 UTC 偏移量更用户友好)。
如果我希望在网站上实现这种上下文敏感的渲染,看起来我将不得不在我的事件时间(以及我存储的任何其他时区感知日期/时间)旁边存储时区名称。
但是我对基于推理而非知识做出这样的承诺感到不自在,并且想要一些支持或反驳这些推理的证据。
我正在尝试执行以下查询
INSERT INTO hotspot(timestamp) VALUES
(timestamp with time zone '2012-10-25 14:00:00 +05:00' at time zone 'EET');
Run Code Online (Sandbox Code Playgroud)
我想将时间戳作为变量传递.
我的时间戳列是带时区的时间戳类型.
你知道如何做到这一点吗?
当我做...(Java,Postgresql)
String stm= "INSERT INTO hotspot(timestamp) VALUES(timestamp with time zone ? at time zone 'EET')";
pst = con.prepareStatement(stm);
pst.setString(1, "2012-08-24 14:00:00 +05:00");
pst.executeUpdate();
Run Code Online (Sandbox Code Playgroud)
我在"$ 1"或附近收到语法错误
无论如何我能克服这个错误吗?先感谢您!!
更新:我尝试通过以下方式使用setTimestamp ...
Calendar c=Calendar.getInstance(TimeZone.getTimeZone("GMT+05:00"));
String stm= "INSERT INTO hotspot(timestamp) VALUES(?)";
pst = con.prepareStatement(stm);
pst.setTimestamp(1,Timestamp.valueOf("2012-01-05 14:00:00"), c );
pst.executeUpdate();
Run Code Online (Sandbox Code Playgroud)
我想数据库中的正确值应该是(关于我的本地时区是EET(+02))
2012-01-05 11:00:00 +02
但使用pgadmin我检查值,我得到
2012-01-05 14:00:00 +02
有什么建议?
postgresql syntax-error insert-update timestamp-with-timezone
基于 Oracle 文档,它在内部以数字形式存储时间戳和时区的不同部分。我读了这篇文章http://www.orafaq.com/wiki/Timestamp ,它解释了时间戳内部格式的算法。所以我做了一个简单的测试来验证它。
SQL> create table tz_test(id number, tz timestamp with time zone);
Table created.
SQL> insert into tz_test values(1, timestamp '1999-10-29 21:00:00 -7:00');
1 row created.
SQL> insert into tz_test values(2, timestamp '1999-10-29 21:00:00 US/Pacific');
1 row created.
SQL> select id, dump(tz, 10) from tz_test where tz=timestamp '1999-10-29 21:00:00 -7:00';
ID DUMP(TZ,10)
--------------------------------------------------------------------------------
1 Typ=181 Len=13: 119,199,10,30,5,1,1,0,0,0,0,13,60
2 Typ=181 Len=13: 119,199,10,30,5,1,1,0,0,0,0,137,156
Run Code Online (Sandbox Code Playgroud)
orafaq 中的文章谈到了 oracle 如何存储时区偏移量,我的第一行测试证明了这一点。但是没有关于如何存储时区文字的内容。所以我很想知道它。我也想知道 oracle 在内部如何评估时间戳 '1999-10-29 21:00:00 -7:00' 和时间戳 '1999-10-29 21:00:00 US/Pacific' 是相同的。
我在我的中找到了以下行postgresql.conf:
timezone = 'CET'
Run Code Online (Sandbox Code Playgroud)
我也通过查询设置得到了这个:
postgres=# show timezone;
TimeZone
----------
CET
Run Code Online (Sandbox Code Playgroud)
无论如何,我们目前仍然有 DST 活动,下面的示例显示服务器知道这一点(+02 是 CEST):
postgres=# select now();
now
-------------------------------
2019-10-09 02:03:33.48477+02
Run Code Online (Sandbox Code Playgroud)
但也有 PostgreSQL 已知的时区,缩写为 DST CET,并且没有 DST。特别是,所有具有此缩写的时区都有偏移+01:
postgres=# select * from pg_timezone_names() where abbrev = 'CET';
name | abbrev | utc_offset | is_dst
----------------+--------+------------+--------
Africa/Algiers | CET | 01:00:00 | f
Africa/Tunis | CET | 01:00:00 | f
postgres=# select * from pg_timezone_abbrevs where abbrev = 'CET';
abbrev | utc_offset | is_dst
--------+------------+--------
CET | …Run Code Online (Sandbox Code Playgroud) postgresql ×6
sql ×2
timezone ×2
date ×1
hive ×1
laravel ×1
oracle ×1
php-carbon ×1
posixct ×1
r ×1
syntax-error ×1
timestamp ×1
utc ×1
xts ×1