Oracle Date字段 - 时间问题

时间:2009-08-25 14:44:59

标签: vb.net oracle datetime stored-procedures

我们在两个不同的位置有两个数据库。其中一个数据库位于与我们的用户不同的时区。

问题是,当使用Date值更新位于不同时区的数据库时,数据库会自动从传递日期开始减去1小时。

问题是,当传递NULL日期(12:00:00)时,DAY值会更改为前一天。

更新通过存储过程完成,前端是VB.NET智能客户端。

你会如何以正确的方式处理?我基本上根本不想存储TIME,但我似乎无法弄清楚如何做到这一点。

3 个答案:

答案 0 :(得分:2)

不清楚数据库中您想要的日期时间,或者应用程序传递的内容。

假设用户的PC告诉他是星期二上午12:30,而Db服务器上的时钟是星期一,晚上11:30。

如果为“当前日期”插入一个值(例如TRUNC(SYSDATE)),那么就数据库而言,它仍然是星期一。 如果为“当前时间(例如SYSDATE)”插入一个值,它仍然是星期一。 如果您为会话的当前时间(例如CURRENT_TIMESTAMP)和时区插入一个值并要求数据库将其存储在数据库中,它将存储在晚上11:30。 如果您要求数据库存储日期时间'2009-12-31 14:00:00',那么它将存储它。如果您要求它存储日期时间/时区'2009-12-31 14:00:00 +08:00',那么您就在高级手册中。您可以要求数据库使用timezone data存储时间戳。另请考虑daylight saving

答案 1 :(得分:1)

我会调查使用更新表的存储过程方法中的TRUNC函数。如果方法中的数据类型(更新表)不是DATE类型,则将to_date函数与TRUNC函数结合使用。

答案 2 :(得分:1)

这超出了您提出的问题的范围,但我建议在用户从不同时区访问数据库的所有情况下,服务器和数据库时钟时区应设置为UTC。这可能为时已晚,但将数据库服务器设置为UTC可消除夏令时和不同时区造成的问题。

在我的观点中,日期/时间数据可以并且应该始终以UTC格式存储。该数据可以在呈现给用户的点处被转换为本地时间。 Oracle实际上使用带有TIME ZONE数据类型的TIMESTAMP使这很容易。它允许您以UTC(SYS_EXTRACT_UTC)或本地时间(本地数据库服务器)访问数据。

世界上所有地方都不是同一天,所以没有时间就不能考虑日期。

当然,我的另一个观点是应该消除夏令时。但这是另一个话题。