我们有一个 Sybase 数据库,当前在某些表中存储日期时间值。如果我们将装有 Sybase 数据库的服务器移动到位于另一个时区的另一个国家/地区,数据库中的日期时间值是否会以不同的方式表示?
换句话说,请考虑以下场景:
Sybase 数据库在时区 +2:00 运行。
从我位于时区 +1:00 的 Java 应用程序中,它将 1970 年 1 月 1 日 1:00 写入数据库,这是应用程序时区中的纪元 0。
preparedStatement.setTimestamp(3, new Timestamp(0));
Run Code Online (Sandbox Code Playgroud)
但是,当我使用 SQL Workbench/J 客户端(时区 +1:00)查询数据库时,我看到
1970-01-01 01:00:00
Run Code Online (Sandbox Code Playgroud)
在我的桌子上。事实上,无论我将计算机时钟更改为哪个时区,SQL Workbench/J 客户端始终1970-01-01 01:00:00从数据库中读取数据。
位于时区 +3:00 的另一个 Java 客户端读取的值与
1970-01-01 01:00:00
Run Code Online (Sandbox Code Playgroud)
翻译为纪元-7200000或-2:00客户的时区!
那么回到我原来的问题,Sybase 是否将日期时间值存储为字符串或纪元?我没有可以进行实验的免费 Sybase 服务器,那么当我们将服务器移动到另一个时区不同的国家/地区时,我们会发生什么情况呢?
我们使用的类型是“datetime”,例如:
CREATE TABLE "dbo"."whatever" (eventDate datetime NOT NULL);
Run Code Online (Sandbox Code Playgroud) 考虑到一个指定的表bananas
和一个timestamp without time zone名为列end_time
和 一些 psql客户有set timezone to 'UTC'
和 其他 psql客户端有set timezone to 'US/Eastern'
和服务器配置有timezone = 'UTC'中postgresql.conf
如何编写支票约束bananas.end_time以确保end_time始终是一天的结束,定义为“美国/东部”一天的第 23 小时 59 分 59 秒?
我试过:
alter table bananas
add constraint ck_end_time_is_end_of_day
check (
23 = date_part('hour', end_time at time zone 'UTC' at time zone 'US/Eastern')
and 59 = date_part('minute', end_time at time zone 'UTC' at time zone …Run Code Online (Sandbox Code Playgroud) Postgres 在解析时区时表现出一些奇怪的行为,或者我只是不明白它是如何工作的。
从文档:
Run Code Online (Sandbox Code Playgroud)SELECT TIMESTAMP WITH TIME ZONE '2001-02-16 20:38:40-05' AT TIME ZONE 'MST'; Result: 2001-02-16 18:38:40该示例采用 EST (UTC-5) 中指定的时间戳并将其转换为 MST (UTC-7) 中的本地时间。
这似乎意味着“MST”可以与“UTC-7”互换,但行为与您期望的相反。
SELECT TIMESTAMP WITH TIME ZONE '2001-02-16 20:38:40-05' AT TIME ZONE 'UTC-7';
Result: 2001-02-17 08:38:40
Run Code Online (Sandbox Code Playgroud)
它没有使用时区“UTC-7”,而是使用时区“UTC+7”,相差 14 小时。
使用 ISO 8601 时区符号也会产生与预期结果相反的结果:
SELECT TIMESTAMP WITH TIME ZONE '2001-02-16 20:38:40-05' AT TIME ZONE '-7';
Result: 2001-02-17 08:38:40
SELECT TIMESTAMP WITH TIME ZONE '2001-02-16 20:38:40-05' AT TIME ZONE '-07';
Result: 2001-02-17 08:38:40
SELECT TIMESTAMP …Run Code Online (Sandbox Code Playgroud) timestamp with time zone对比timestamp without time zone:
我知道这timestamptz与在数据库中保存值时添加的时间戳无时区+(时区差)相同。也就是说,在数据库中,当存储时,它们都是无法区分的。
比如说,我决定只使用timestamp without time zone,即使是在推荐的情况下timestamp with time zone。我网站的用户可以记住,我和他们将始终使用 UTC 进行操作,即使我们碰巧处于不同的时区,效果会timestamp without time zone很好且没有缺陷吗?
我正在将一些 datetimeoffset 列的时间从 UTC 转换为东部时间。我通过命令执行此操作
UPDATE MyTable SET MyColumn = MyColumn AT TIME ZONE 'Eastern Standard Time'
Run Code Online (Sandbox Code Playgroud)
这似乎工作正常(时间提前了 4 小时,现在有 -04:00 偏移量,正是我想要的),但后来我意识到这不是 EST,现在是 EDT。
SELECT * FROM sys.time_zone_info
Run Code Online (Sandbox Code Playgroud)
给我一个时区列表,但没有“东部夏令时间”,只有“东部标准时间”。有一个“is_current_dst”列似乎是正确的。但据我所知,谈论时区“东部标准时间”是否处于 DST 是没有任何意义的。东部标准时间意味着它不是夏令时。“东部夏令时”的意思是夏令时。对我来说,这似乎是获得一个动物列表,列表中没有“Dog”和“Cat”,只有“Dog”,带有“isCat”标志!
我很困惑为什么时区被称为“东部标准时间”(以及为什么我上面的更新语句将时间转换为东部夏令时间(又名 UTC -04:00)。
时区名称是否不正确,它实际上应该只是“东部时间”之类的内容,并带有标志告诉当前是 EST 还是 EDT?
或者我只是完全困惑?
对于我的 Django 应用程序,我必须将时区设置为 UTC,但是我无法设置它,因为我在系统数据库中找不到任何与时区相关的表。
我怎么得到那些?此处https://dev.mysql.com/downloads/timezones.html 中可用的脚本仅与加载表中的数据有关,而与创建它们无关。
我将 AWS RDS 用于带有 PGAdmin 的 PostgreSQL 11 数据库。我存储每一行的创建日期,now()::timestamp用于存储没有时区的日期和时间。问题是存储的时间永远不是我想要的值 ( UTC+05:30)。
如果我设定的参数timezone为UTC在RDS,然后储存时间的背后是印度时间5:30小时,但如果我设置UTC + 05:30,它存储时间背后要么11小时或1小时以上,这种情况随机随机行。我没有改变任何其他东西,只是这个timezone参数。
我搜索了很多,但没有找到任何类似的答案。
有没有办法在插入查询时自动插入带区域的时间戳?(就像 id 自动递增,因为我不想在 sql 中传递参数作为时间,如果我们使用 zone,则每个地方都相同)。pg 9.1 版。以及如何使用所需的时间格式?
我在 Oracle 数据库中没有得到正确的时区。该问题仅从 2021 年开始发生。请查看两个相同的查询 - 第一个是 2020 年,第二个是 2021 年。第一个正确地将时区指定为 EDT;第二个错误地给出了 EST。如何解决这个问题?
SELECT
TO_CHAR(FROM_TZ(TIMESTAMP '2020-08-01 00:00:00', 'America/New_York'),'TZD') AS TIMEZONE
FROM DUAL ;
---
EDT
SELECT
TO_CHAR(FROM_TZ(TIMESTAMP '2021-08-01 00:00:00', 'America/New_York'),'TZD') AS TIMEZONE
FROM DUAL ;
---
EST
Run Code Online (Sandbox Code Playgroud) 我有一个应用程序,它使用 UTC(协调世界时)将其时间戳存储在 Oracle 中。另一个应用程序从数据库中读取这些时间戳,但没有方便的方法将时间戳自动转换为另一个时区(从该应用程序中)。是否可以调整 Oracle 中的会话设置以返回 SELECT 查询的时区调整时间戳?
随着欧洲的时钟变化 - SQL Server 如何处理时钟变化?是否存在与时钟更改相关的已知问题?
timezone ×11
postgresql ×5
timestamp ×3
oracle ×2
sql-server ×2
constraint ×1
datatypes ×1
datetime ×1
java ×1
jdbc ×1
mysql ×1
mysql-5.7 ×1
sybase ×1
time ×1