标签: timezone

将 Postgres TIMESTAMP 转换为 TIMESTAMPTZ

我有一个在 Postgres 上运行的大小合适(约 50k 行)的时间序列数据库,还有一些其他结构化数据(在另一个数据库实例中)要小得多。

愚蠢的是,当我最初设计这个东西时,我把所有的字段都作为TIMESTAMP WITHOUT TIME ZONE,现在我用恼人的时区相关的错误来支付它。我希望一切都是明确的,所以想将字段转换为TIMESTAMP WITH TIME ZONE. 我意识到这不会存储额外的信息,并且我所有的时间戳都已经在 UTC 中,所以迁移应该是微不足道的,但我想知道是否有任何复杂的事情/潜在的绊倒块会证明有问题(这是一个生产客户依赖它的数据库)?

postgresql migration datatypes timezone

12
推荐指数
1
解决办法
2万
查看次数

数据仓库设计,用于针对多个时区的数据进行报告

我们正在尝试优化数据仓库设计,该设计将支持针对多个时区的数据进行报告。例如,我们可能有一份一个月的活动(数百万行)的报告,需要显示按一天中的小时分组的活动。当然,一天中的那个小时必须是给定时区的“本地”小时。

当我们只支持 UTC 和一个本地时间时,我们的设计运行良好。UTC 和本地时间的日期和时间维度的标准设计,ID 在事实表上。但是,如果我们必须支持 100 多个时区的报告,那么这种方法似乎无法扩展。

我们的事实表会变得很宽。此外,我们必须解决 SQL 中的语法问题,即指定在任何给定的报告运行中使用哪个日期和时间 ID 进行分组。也许是一个非常大的 CASE 语句?

我已经看到一些建议,可以通过您所覆盖的 UTC 时间范围获取所有数据,然后将其返回到表示层以转换为本地并在那里聚合,但是使用 SSRS 进行的有限测试表明这将非常慢。

我也查阅了一些关于这个主题的书籍,他们似乎都说只有 UTC 和转换显示或有 UTC 和一个本地。将不胜感激任何想法和建议。

注意:此问题类似于:处理数据集市/仓库中的时区,但我无法评论该问题,因此觉得这值得自己提出问题。

更新:在Aaron 进行了一些重大更新并发布了示例代码和图表后,我选择了他的答案。我之前对他的回答的评论不再有意义,因为他们提到了答案的原始编辑。如果有必要,我会尝试回来并再次更新

data-warehouse database-design sql-server reporting timezone

10
推荐指数
1
解决办法
3546
查看次数

如何获取 SQL 服务器的时区?

如何根据某些偏移量(如 UTC)查询 SQL 服务器的当前时区设置?

sql-server timezone

10
推荐指数
1
解决办法
2万
查看次数

AT TIME ZONE 能否返回 2004 年之前的数据的不准确结果?

SQL Server 2016添加了AT TIME ZONE运算符。从文档中:

\n
\n

AT TIME ZONE 实现依赖于 Windows 机制来跨时区转换日期时间值。

\n
\n

AT TIME ZONEmscorlib.ni!TimeZoneInfo.ConvertTime根据针对简单查询的 ETW 跟踪调用该方法。乔纳森·凯哈亚斯 (Jonathan Kehayias) 发表了一篇博文,其中他从课堂上提取了所有时区规则System.TimeZoneInfo。我只能在输出中找到于 01/01/2004 或更高版本生效的规则:

\n

兹规则

\n

Rob Farley 在一篇博客文章中提到,2000 年时区规则的更改似乎并未得到遵守AT TIME ZONE

\n
\n

它通过使用 Windows 注册表来工作,其中包含所有这些信息,但遗憾的是,当回顾过去时,它\xe2\x80\x99 并不完美。澳大利亚于 2008 年更改了日期,美国于 2005 年更改了日期 \xe2\x80\x93 两国都在一年中的大部分时间实行夏令时。AT TIME ZONE 明白这一点。但它似乎并没有意识到,2000年的澳大利亚,由于悉尼奥运会,澳大利亚提前了大约两个月开始实行夏令时。

\n
\n

我觉得有大量间接证据表明,AT TIME ZONE对于早于 2004 年的日期,操作员可能会返回不准确的结果。但是,我找不到任何AT TIME ZONE使用该类的文档System.TimeZoneInfo,这些文档AT TIME ZONE对于较旧的日期可能不准确,或者 …

sql-server timezone

10
推荐指数
1
解决办法
1078
查看次数

夏令时

在我的环境中,有一些服务器在本地备份和 Ola Hallengren 计划中运行。我们的服务器是 2008、2012 和 2014 的组合。所有完整备份都是在凌晨 12 点进行的,并且每 15 分钟进行一次日志备份。

我以前从未考虑过夏令时,所以请告诉我应该做哪些调整。

凌晨 12 点的完整备份会受到影响吗?日志备份会怎样?

sql-server-2008 backup timezone netbackup

9
推荐指数
1
解决办法
2293
查看次数

MySQL时间戳时区处理

时间戳数据类型是表示即时值还是年月日时分秒值?一个瞬间就是一个瞬间,就像你开始阅读这篇文章的那一刻一样,它可以用许多不同的 ymdhm-s+timezone 值来描述。没有时区,这是模棱两可的,同一时刻对我来说可能是 17:25,对其他人来说可能是 13:25。

这就是我认为我得到的。该current_timestamp函数返回当前时区的当前时间,所以这是一个明确的时刻,真正的now。在表中,它存储为 UTC,因此使用这个假定的时区,它也应该是明确的。

现在这是我不明白的:这是utc_timestamp函数的存在。我将 acurrent_timestamp和 an存储utc_timestamp在同一列中,它们是不同的。这个函数甚至不应该存在,我不明白为什么它代表不同的时刻。

mysql timestamp timezone

8
推荐指数
2
解决办法
5万
查看次数

从 SQL Server 获取时区键名的最佳方法

以下是我拼凑的内容,但我想看看还有哪些其他方法可用。

SET NOCOUNT ON;
GO
DECLARE @tz VARCHAR(50)
EXEC [master].[dbo].[xp_regread]
    'HKEY_LOCAL_MACHINE'
    ,'SYSTEM\CurrentControlSet\Control\TimeZoneInformation'
    ,'TimeZoneKeyName'
    ,@tz OUT;

SELECT 
    GETDATE()
    ,'(' + LEFT(PARSENAME(REPLACE(@tz, ' ','.'),3),1) 
    + '' + LEFT(PARSENAME(REPLACE(@tz, ' ','.'),2),1) 
    + '' + LEFT(PARSENAME(REPLACE(@tz, ' ','.'),1),1) +')'
Run Code Online (Sandbox Code Playgroud)

输出:2014-10-14 16:22:21.037 (CST)

sql-server timezone

8
推荐指数
1
解决办法
2018
查看次数

为什么/如何在 PostgreSQL 8.4 和 9.2 之间从“没有时区的时间戳”字段中提取(纪元...)的行为发生变化?

语境:

我们目前在生产中运行 PostgreSQL 8.4,并且正在内部测试 9.2 以备将来升级。出现了一些关于日期的问题。除了 PostgreSQL 版本和配置之外,运行 8.4 和 9.2 的服务器在所有方面都相同。两组服务器上存储的数据完全相同;它使用pg_dump和传输pg_restore

在我们数据库的一部分中,我们将日期存储在类型为 的字段中timestamp without time zone

问题:

从该字段访问日期时,extract(epoch..)请求会返回非常不同的结果,具体取决于 Postgres 版本,如下所示:

#On Postgres 8.4. entered_timestamp is a "timestamp without time zone" type column:
SELECT entered_timestamp, extract(epoch from entered_timestamp) AS entered_timestamp from <table row>

 entered_timestamp      | entered_timestamp
 ----------------------------+-------------------
 2012-11-01 06:01:39.699612 |  1351774899.69961
Run Code Online (Sandbox Code Playgroud)

但...

#On Postgres 9.2. All tables, schema, and data are identical, the SELECT statement is identical to the previous one:
SELECT …
Run Code Online (Sandbox Code Playgroud)

postgresql timezone

7
推荐指数
1
解决办法
4480
查看次数

如何使用时区名称在 MySQL 中转换时区?

我想在 MySQL 中将日期从一个时区转换为另一个时区,我正在尝试的 MySQL 查询是

SELECT DATE_FORMAT(CONVERT_TZ('2015-12-18 06:00:00', '+0:00', '-05:00' ),'%b %d %Y %h:%i %p') AS test
FROM appointment
Run Code Online (Sandbox Code Playgroud)

这是正常工作。现在我遇到的问题是我的数据库使用时区名称作为America/New_York

有没有办法使用时区名称而不是时区偏移量来转换时区?

mysql mysql-5.5 timezone

7
推荐指数
1
解决办法
2万
查看次数

具有 AT TIME ZONE 和 UTC 偏移量的奇数

我不明白这两列之间的区别。美国/芝加哥时区是 UTC-6,所以我希望两者都返回相同的结果:

select timezone('America/Chicago', '2017-01-01 12:00:00'::TIMESTAMP AT TIME ZONE 'UTC'),
       timezone('UTC-6'          , '2017-01-01 12:00:00'::TIMESTAMP AT TIME ZONE 'UTC');
Run Code Online (Sandbox Code Playgroud)

然而,结果是:

2017-01-01 06:00:00 | 2017-01-01 18:00:00
Run Code Online (Sandbox Code Playgroud)

而且,这种行为非常尴尬,

SELECT '1:00 -1'::time with time zone AT TIME ZONE '-1'; 
  timezone   
-------------
 03:00:00+01
Run Code Online (Sandbox Code Playgroud)

谁能解释一下?

postgresql timestamp utc-time timezone

7
推荐指数
1
解决办法
3050
查看次数