请看下面的代码:
DECLARE @UKDateTime as DateTime
SELECT @UKDateTime = GETDATE() AT TIME ZONE 'GMT Standard Time'
print @UKDateTime
PRINT GETDATE()
Run Code Online (Sandbox Code Playgroud)
这将返回:
Oct 4 2021 4:03PM
Oct 4 2021 4:03PM
Run Code Online (Sandbox Code Playgroud)
目前英国时间为:下午 5:03(由我的电脑时钟确认)。它似乎正在返回 UTC 日期。问题是什么?
我将 SQL Server 设置为 Docker 容器。它是 SQL Server v18.4。
所以一个月前,我从托管公司购买了一台服务器。
信息是;
Linux Centos(最新版本)。
我安装了 ZPanel,它安装了 phpMyAdmin、MySQL 和所有其他好东西。无论如何,我已经设法将我的服务器时间更改为我的本地时间,即格林威治标准时间。但是,当我尝试在我的 MySQL 服务器上设置它时,它显示了正确的时间,但是当我使用
now()
Run Code Online (Sandbox Code Playgroud)
PHP 中的函数,时间比我的当前时间提前 1 小时存储,这几乎弄乱了我的系统。
有谁知道如何解决这一问题?请已经几个星期了,但没有什么可以解决的:/
谢谢你。
Postgresdate_trunc对timestampor进行操作interval,并且:
日期和时间类型的值分别自动转换为时间戳或间隔。
换句话说,我们可以使用date_trunc强制转换的date值:
select date_trunc('month',current_date)::date;
??????????????
? date_trunc ?
??????????????
? 2014-12-01 ?
??????????????
Run Code Online (Sandbox Code Playgroud)
但是这个时区是否安全——如果当前日期是夏令时而月份的开始不是,反之亦然会得到正确的日期吗?
我已经调试了很多,最后设法在 mysql shell 中重现它。
我将时间戳存储在字段类型为 的 mysql 数据库中timestamp。我用来FROM_UNIXTIME()从我的脚本中更新它们,并UNIX_TIMESTAMP()在选择它们时使用。
当我没有在使用SET time_zone =它的连接中设置时区时,它工作正常。但是当我设置时区时,会发生以下情况:
UNIX_TIMESTAMP() 仍然给出正确的结果。UPDATE table SET field = FROM_UNIXTIME(..) 在数据库中设置错误的值。我知道是 FROM_UNIXTIME() 不起作用,因为当我打开另一个没有连接特定时区的连接时,我看到错误的值,直到我再次更新它。
它是 1 小时的差异这一事实让我认为这可能是夏令时问题。因为柏林有夏令时而曼谷没有(据我所知)。
这是 mysql shell 的未修改日志,我在其中重现了此行为。
服务器时区是亚洲/曼谷(CIT)
$ mysql -uroot -p timezonetest
Enter password:
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with …Run Code Online (Sandbox Code Playgroud) 我的计算机/SQL Server 2014 使用比 UTC 时间晚 5 小时的东部时区。但是当我运行以下代码时,我得到了 4 小时的差异。
CREATE TABLE datetimeoffsetfunction(
servertime DATETIME2,
utc_servertime DATETIME2,
offset_datetime DATETIMEOFFSET,
switch_offset DATETIMEOFFSET,
to_datetime DATETIMEOFFSET
);
INSERT INTO datetimeoffsetfunction
VALUES ( SYSDATETIME(),
SYSUTCDATETIME(),
SYSDATETIMEOFFSET(),
SWITCHOFFSET( SYSDATETIMEOFFSET(), '+05:00'),
TODATETIMEOFFSET( SYSDATETIME(), '+05:00')
);
The result I got is
servertime: 2016-07-09 23:59:16.4770556
utc_servertime: 2016-07-10 03:59:16.4770556
offset_datetime: 2016-07-09 23:59:16.4770556 -04:00
switch_offset: 2016-07-10 08:59:16.4770556 +05:00
to_datetime: 2016-07-09 23:59:16.4770556 +05:00
Run Code Online (Sandbox Code Playgroud)
servertime 是我的系统时间,考虑到夏令时,我可以解释为什么 servertime 和 utc_servertime 之间只有四个小时的差异。但我确实希望offset_datetime为 2016-07-09 23:59:16.4770556 -05:00除非 SQL Serve 现在考虑了夏令时。
所以我的问题是现在是否自动考虑夏令时是 SQL Server,至少从 …
沿着这个相关问题的思路:
是否有任何有效的实际使用用例 TIME WITH TIME ZONE或应该将其视为反模式?
需要明确的是:我问的是TIME…,而不是TIMESTAMP…。
例如,我有一个带有时间戳的表:
2018-04-05 06:00:00 +01
2018-04-05 06:00:00 +00
2018-04-05 06:00:00 -01
2018-04-05 04:00:00 -01
Run Code Online (Sandbox Code Playgroud)
我想要获得的条目是......
BETWEEN 2018-04-05 06:00:00+01 AND 2018-04-05 07:00:00+01
Run Code Online (Sandbox Code Playgroud)
所以我的输出是:
2018-04-05 06:00:00 +01
2018-04-05 04:00:00 -01
Run Code Online (Sandbox Code Playgroud)
操作员会BETWEEN自动处理时区差异并为我提供所需的输出吗?
我一直在研究“查看”时间的不同方式以及如何在 Postgres 中正确映射它,但我仍然不确定实际使用什么。有几篇文章建议或者更确切地说说服您将日期存储为timestamp with time zone,而不是存储为 just timestamp。我尤其在夏令时方面遇到困难。
我的用例是一个简单的面向最终用户的应用程序,只能由“欧洲/柏林”时区的人员访问。用户撰写的帖子会与创建和更新的时间戳一起存储。
假设用户在 上发布了帖子2020-01-01T10:00:00+01。如果用户现在在同一天阅读该帖子,它应该显示posted on 1st of January at 10 am。如果同一篇文章7 月在柏林被点击,它仍然应该显示posted on 1st of January at 10 am“无论夏令时如何”。
我的直觉是将时间存储为 a timestamp without time zone,否则 Postgres 会将该时间转换为 UTC 并以这种方式存储。稍后我将无法参考该帖子发布的实际时区。在这种情况下,它会显示为posted on 1st of January at 11 am(由于柏林现在提前两个小时),如果作者要检查最初的时间,这可能会让他们感到困惑发表了这篇文章。
我的想法是否正确,我是否发现了不使用的极端情况之一timestamp with time zone,或者我在这里错过了一些重要的东西?
SQL Server 2012 中是否有办法获取特定日期/时间的服务器时区?在 SQL Server 2016 中,您有AT TIME ZONE,但在 2012 年不可用。我有一个datetimeoffset,我需要将其转换为服务器的时区(在那个日期),然后再将其截断为datetime. SWITCHOFFSET仅当您知道偏移量时才有效,但对于每年更改两次时区的服务器,偏移量会来回翻转。
此查询说明了 SQL Server 2016 中的功能:
SELECT @@SERVERNAME AS [SERVERNAME]
, GETDATE() AT TIME ZONE 'Central Standard Time' AS [GETDATE() AT TIME ZONE 'Central Standard Time']
, GETDATE() AT TIME ZONE 'Eastern Standard Time' AS [GETDATE() AT TIME ZONE 'Eastern Standard Time']
, DATEADD(MONTH, -6, GETDATE()) AT TIME ZONE 'Central Standard Time' AS [DATEADD(MONTH, -6, GETDATE()) AT TIME ZONE 'Central Standard …Run Code Online (Sandbox Code Playgroud) 似乎将列从 更改为timestamp without time zone会timestamp with time zone根据语句时的当前会话时区转换现有数据alter。
请参阅此示例,每个语句后显示输出
\ncreate table tztest (col1 timestamp without time zone);\n\nset timezone = 'UTC';\ninsert into tztest (col1) values ('2023-02-01 10:10:10');\nselect col1 as t1, extract(epoch FROM col1) from tztest;\n-- \xe2\x86\x92 2023-02-01 10:10:10 1675246210\n\nset timezone = 'America/New_York';\nalter table tztest alter column col1 type timestamp with time zone;\nselect col1 as t2, extract(epoch FROM col1) from tztest;\n-- \xe2\x86\x92 2023-02-01 10:10:10-05 1675264210\n\nset timezone = 'UTC';\nselect col1 as t3, extract(epoch FROM col1) …Run Code Online (Sandbox Code Playgroud) timezone ×10
postgresql ×5
datetime ×3
sql-server ×3
timestamp ×3
mysql ×2
alter-table ×1
datatypes ×1
date ×1
linux ×1
t-sql ×1
time ×1