如何设置默认值为当前 UTC 时间的时间戳列?
MySQL 使用UTC_TIMESTAMP()UTC 时间戳函数:
mysql> SELECT UTC_TIMESTAMP();
+---------------------+
| UTC_TIMESTAMP() |
+---------------------+
| 2012-07-01 11:36:35 |
+---------------------+
1 row in set (0.00 sec)
Run Code Online (Sandbox Code Playgroud)
所以我试过:
CREATE TABLE `blah` (
`creation_time` TIMESTAMP DEFAULT UTC_TIMESTAMP,
...
Run Code Online (Sandbox Code Playgroud)
和其他变体,如UTC_TIMESTAMP(),但没有成功。
我目前使用以下方法从 UTC 日期时间获取本地日期时间:
SET @offset = DateDiff(minute, GetUTCDate(), GetDate())
SET @localDateTime = DateAdd(minute, @offset, @utcDateTime)
Run Code Online (Sandbox Code Playgroud)
我的问题是,如果夏令时发生在GetUTCDate()和之间@utcDateTime,@localDateTime最终会休息一个小时。
是否有一种简单的方法可以将非当前日期的日期从 UTC 转换为当地时间?
我使用的是 SQL Server 2005
我正在研究 PostgreSQL 数据库设计,我想知道如何最好地存储时间戳。
不同时区的用户将使用数据库执行所有 CRUD 功能。
我查看了 2 个选项:
timestamp NOT NULL DEFAULT (now() AT TIME ZONE 'UTC')
bigint NOT NULL DEFAULT
因为timestamp我会发送一个字符串来表示 INSERT 时刻的确切(UTC)时间戳。
因为bigint我会存储完全相同的东西,但以数字格式存储。(时区问题是在将毫秒移交给服务器之前处理的,因此总是以 UTC 为单位的毫秒。)
存储 a 的一个主要优点bigint可能是它更容易存储和检索,因为传递正确格式的时间戳比简单的数字(自 Unix Epoc 以来的毫秒)更复杂。
我的问题是哪种方法可以实现最灵活的设计,以及每种方法可能存在哪些缺陷。
我不明白这两列之间的区别。美国/芝加哥时区是 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)
谁能解释一下?
假设我有一个全球网站(我的意思是它有来自世界各地的用途)。
我有一台位于德国的服务器(在某个城市)。它永远不会从德国转移——永远。
我的问题是:
当用户保存数据时,我需要保存操作日期:
我应该将它保存(我认为我这样做)UTC吗?
或者因为 - 服务器位于一个位置 - 可以保存所有日期,GetDATE()
因此相对论点是相同的。
我错了吗 ?如果我这样做,你能提供一个简单的场景,它会失败吗?
utc-time ×5
timestamp ×3
timezone ×3
postgresql ×2
sql-server ×2
datatypes ×1
mysql ×1
syntax ×1