我正在处理Rails和Postgres中的日期和时间并遇到这个问题:
数据库采用UTC格式.
用户在Rails应用程序中设置选择的时区,但仅在获取用户本地时间来比较时间时使用.
用户存储时间,例如2012年3月17日晚上7点.我不希望存储时区转换或时区.我只想保存日期和时间.这样,如果用户改变他们的时区,它仍将显示2012年3月17日,晚上7点.
我只使用用户指定的时区来获取用户本地时区当前时间之前或之后的记录.
我目前正在使用"没有时区的时间戳",但是当我检索记录时,rails(?)会将它们转换为应用程序中的时区,这是我不想要的.
Appointment.first.time
=> Fri, 02 Mar 2012 19:00:00 UTC +00:00
Run Code Online (Sandbox Code Playgroud)
因为数据库中的记录似乎是以UTC形式出现的,我的黑客是用当前时间,用'Date.strptime(str,"%m /%d /%Y")删除时区,然后做我的查询:
.where("time >= ?", date_start)
Run Code Online (Sandbox Code Playgroud)
似乎必须有一种更简单的方法来忽略周围的时区.有任何想法吗?
我有共同的问题。
无法将 Kind=UTC 的 DateTime 写入 PostgreSQL 类型“不带时区的时间戳”
我想启用旧版时间戳行为,如下所示: https: //github.com/npgsql/doc/blob/main/conceptual/Npgsql/types/datetime.md/
public MyDbContext(DbContextOptions<MyDbContext> contextOptions) : base(contextOptions)
{
AppContext.SetSwitch("Npgsql.EnableLegacyTimestampBehavior", true);
AppContext.SetSwitch("Npgsql.DisableDateTimeInfinityConversions", true);
}
Run Code Online (Sandbox Code Playgroud)
但不起作用。我仍然遇到同样的错误。
我做错了什么。为什么遗留行为不起作用?
如何以UTC格式将日期列的默认值设置为"now"?我认为答案涉及列元素的defaultValueComputed
属性.
文件说明:
defaultValueComputed从函数或过程调用返回的值.该属性将包含要调用的函数.
langauge是指应该写入的函数?Java的?该函数应该是我想要使用的数据库供应商特定的日期函数吗?我可以阅读有关此主题的更多文档吗?
Spring Boot 3 (Hibernate 6.1) in combination with PostgreSQL seems to have a problem with Instant
values mapped to SQL timestamp
s (without time zone
), as the following test case fails. Values read differ from the written values by the amount of the local time zone offset.
The test case executes successfully when using the H2 test database or when switching back to Spring Boot 2.7.6 (Hibernate 5.6).
JPA entity:
@Entity
public class MyEntity {
@Id
UUID id …
Run Code Online (Sandbox Code Playgroud) 如何将postgreSql中的"timestamp with time zone"数据类型映射到System.Data.DbType
我需要传递参数,因为它将转到具有"timestamp with time zone"的列
以下是我的代码:
var pOrderDate = cmdOrder.CreateParameter();
pOrderDate.ParameterName = "OrderDate";
pOrderDate.DbType = System.Data.DbType.DateTime;
pOrderDate.Value = objOrder.OrderDate;
cmdOrder.Parameters.Add(pOrderDate);
Run Code Online (Sandbox Code Playgroud)
以下行导致问题:
pOrderDate.DbType = System.Data.DbType.DateTime;
Run Code Online (Sandbox Code Playgroud) 我有一张关于文章信息的表格。我有一个published_at
专栏,timestamp without time zone
想要计算每篇文章发表的时间,以天为单位。
所以如果它是一周前发布的,我应该回来7
。
知道该怎么做吗?
我知道 Postgres 有,NOW()
但我可以减去然后取DAY()
吗?
谢谢!
想要DateTime
在Ecto模式和迁移中使用,而不是默认值NaiveDateTime
,也要timestamptz
在PostgreSQL中使用,而不是默认值timestamp
(aka。timestamp without time zone
)。
我正在使用 Flask sqlalchemy 和 postgreSQL 并且显示的日期时间有问题,在调查这个问题时我发现了另一个奇怪的事情:
在隐身模式(chrome 浏览器选项卡)下创建数据库条目会给出不同/错误的时间。编辑:它与隐身模式无关,这两种情况也发生在正常模式下。我还没有弄清楚为什么。
这是代码:
我更改了数据库的默认时区:
ALTER DATABASE postgres SET timezone TO 'Europe/Berlin';
Run Code Online (Sandbox Code Playgroud)
该模型:
class User(UserMixin, Base):
__tablename__ = 'users'
date_added = Column(DateTime(timezone=True), nullable=False)
Run Code Online (Sandbox Code Playgroud)
我用来将日期时间添加到数据库的方法:
date_added=datetime.today()
Run Code Online (Sandbox Code Playgroud)
它在数据库中的外观(此时我的本地时间是 13:53:46):
不在隐身模式下创建条目
timestamp with time zone
2019-02-01 13:53:46.73817+01
Run Code Online (Sandbox Code Playgroud)
在隐身模式下创建条目
timestamp with time zone
2019-02-01 12:53:46.73817+01
Run Code Online (Sandbox Code Playgroud)
这真的让我担心。这是错误的。即使我将日期时间对象转换为本地时间。两个条目同时完成,但显示不同的结果,这怎么可能?
同样在 HTML 中查看这些日期时,postgreSQL 不会应用偏移量,因此第一个日期看起来正确,但第二个日期是错误的。
最初我只是想找到一种方法来在欧洲/柏林存储所有日期时间对象并在欧洲/柏林时间返回它们,所以我不必将 UTC 转换为欧洲/柏林,但现在我认为出现了可怕的错误。
我也到处都仔细检查了我的代码,我没有使用其他方法来操作日期时间对象。
编辑
每次用户登录时,我都会保存一个日期时间。目前我在非隐身模式下尝试过。我的本地时间是14:13:33
但它保存到数据库中:
2019-02-01 13:13:33.804339+01
。这怎么可能?我知道它不能是随机的,但现在看起来它的保存时间是随机的,有时是带有偏移量的 UTC,有时是带有偏移量的欧洲/柏林。
编辑
我仔细检查了所有有问题的表格SHOW timezone;
,它们都正确返回Europe/Berlin
postgresql ×6
c# ×2
datetime ×2
timezone ×2
.net-6.0 ×1
ecto ×1
elixir ×1
hibernate ×1
java ×1
liquibase ×1
npgsql ×1
python ×1
spring-boot ×1
sql ×1
sqlalchemy ×1