Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Postgres日期\u TRUNC正在移动时间戳_Python_Postgresql_Postgresql 11 - Fatal编程技术网

Python Postgres日期\u TRUNC正在移动时间戳

Python Postgres日期\u TRUNC正在移动时间戳,python,postgresql,postgresql-11,Python,Postgresql,Postgresql 11,我正在使用一个名为architect的python包,它有助于在Django模型中使用Postgres分区。我每个月都会设置分区表。但是在检查约束中,我看到被截断的日期正在被移动。比如说 DATE\u TRUNC('month','2020-09-12 15:23:00+05:45')给出了2020-09-01 05:45:00+05:45 因此,检查约束变为 CONSTRAINT "transactionservice_transaction_y2020m09_TransactionDate_

我正在使用一个名为architect的python包,它有助于在Django模型中使用Postgres分区。我每个月都会设置分区表。但是在检查约束中,我看到被截断的日期正在被移动。比如说

DATE\u TRUNC('month','2020-09-12 15:23:00+05:45')
给出了
2020-09-01 05:45:00+05:45

因此,检查约束变为

CONSTRAINT "transactionservice_transaction_y2020m09_TransactionDate_check" CHECK ("TransactionDate" >= '2020-09-01 05:45:00+05:45'::timestamp with time zone AND "TransactionDate" < '2020-10-01 05:45:00+05:45'::timestamp with time zone)
)

有谁能向我解释一下是什么导致了这种变化吗?请注意,
2020-09-01 05:45:00+05:45
2020-09-01 00:00:00Z
在不同的时区中是相同的时间点。一个在+05:45,另一个在UTC。您的应用程序可能将
2020-09-01 00:00:00
解释为UTC,然后将其更改为应用程序的时区

如果列是不带时区的
时间戳
日期
将生成不带时区的时间戳。我的时区是-0700

select date_trunc('month', timestamp '2020-09-12 15:23:00+05:45')
2020-09-01 00:00:00

select date_trunc('month', timestamptz '2020-09-12 15:23:00+05:45')
2020-09-01 00:00:00-07
2020-09-01 00:00:00
是一个不明确的时间点。应用程序可能会将其解释为UTC或应用程序的时区+05:45。它似乎将其解释为UTC,然后将其转换为应用程序的时间。
2020-09-01 00:00:00
在UTC中是
2020-09-01 05:45:00+05:45

政府似乎证实了这一点

启用时区支持后,Django在数据库中以UTC格式存储日期时间信息,在内部使用时区感知的datetime对象,并以模板和表单将其转换为最终用户的时区


我对Django不太熟悉,不能确切地说如何解决这个问题。在“3.now.date()是昨天!(或明天)”一节中,关于将日期时间转换为可能相关的日期的陷阱。

请注意,
2020-09-01 05:45:00+05:45
2020-09-01 00:00:00Z
在不同时区中是相同的时间点。一个在+05:45,另一个在UTC。您的应用程序可能将
2020-09-01 00:00:00
解释为UTC,然后将其更改为应用程序的时区

如果列是不带时区的
时间戳
日期
将生成不带时区的时间戳。我的时区是-0700

select date_trunc('month', timestamp '2020-09-12 15:23:00+05:45')
2020-09-01 00:00:00

select date_trunc('month', timestamptz '2020-09-12 15:23:00+05:45')
2020-09-01 00:00:00-07
2020-09-01 00:00:00
是一个不明确的时间点。应用程序可能会将其解释为UTC或应用程序的时区+05:45。它似乎将其解释为UTC,然后将其转换为应用程序的时间。
2020-09-01 00:00:00
在UTC中是
2020-09-01 05:45:00+05:45

政府似乎证实了这一点

启用时区支持后,Django在数据库中以UTC格式存储日期时间信息,在内部使用时区感知的datetime对象,并以模板和表单将其转换为最终用户的时区


我对Django不太熟悉,不能确切地说如何解决这个问题。在“3.now.date()是昨天!(或明天)”一节中,关于将日期时间转换为可能相关的日期的陷阱。

该列是什么类型的<代码>时间戳或
时间戳
?其时间戳是什么类型的列<代码>时间戳或
时间戳
?它的时间戳那么,当我插入一行时间戳为UTC时,日期会将它截断为UTC时间2020-09-01 00:00:00,Postgres会在我的时区中显示该时间戳吗?现在,如果我插入一行时间戳在我的时区,那么date_trunc应该按预期工作,对吗?@jimmy基本问题是时间戳/日期时间是绝对时间点,但日期不是
2020-09-01 00:00:00+05:45和
2020-08-31 18:15:00Z是同一时间点,但一个是9月初,另一个是8月底。如果你希望月初在你的时区内,并且你是用时间戳来做这件事的,你必须小心地把它和时区联系在一起。作为
2020-09-01 00:00:00+05:45
2020-08-31 18:15:00Z
。不要像
2020-09-01 00:00:00
那样模棱两可。这是我有根据的猜测。我希望2020-09-01 00:00:00+05:45是date_trunc的输出。而当前的输出2020-09-01 05:45:00+05:45将完全破坏分区,将9月的行放入8月的行。我尝试了UTC和我的时区(亚洲/加德满都),但我始终会得到移位的时间戳。@jimmy读了一些关于architect的文章,我相信它的
date\u trunc
将在数据库的时区中运行。既然这是表分区,那么一行最终会进入哪个分区又有什么关系呢?如果您正在查询主表,它应该没有任何效果。您可能还希望使用更简单的工具(例如)来管理它们。那么,当我插入一行时间戳为UTC时,日期会将其截断为UTC时间2020-09-01 00:00:00,Postgres会显示我所在时区的时间戳吗?现在,如果我插入一行时间戳在我的时区,那么date_trunc应该按预期工作,对吗?@jimmy基本问题是时间戳/日期时间是绝对时间点,但日期不是
2020-09-01 00:00:00+05:45和
2020-08-31 18:15:00Z是同一时间点,但一个是9月初,另一个是8月底。如果你希望月初在你的时区内,并且你是用时间戳来做这件事的,你必须小心地把它和时区联系在一起。作为
2020-09-01 00:00:00+05:45
2020-08-31 18:15:00Z
。不要像
2020-09-01 00:00:00
那样模棱两可。这是我有根据的猜测。我希望2020-09-01 00:00:00+05:45是date_trunc的输出。而当前的输出2020-09-01 05:45:00+05:45将完全破坏分区,将9月的行放入8月的行。“我试过UTC和我的时区(亚洲/加德满都),但我总是会得到移位的时间戳。”吉米读了一篇文章