我正在学习 Drupal 并问了这个问题:
我决定检查一下,在 Unix 时代结束后 CMS 将如何表现。将我的本地日期设置为 01.01.2040 并重新启动。
令我惊讶的是,该网站根本不起作用。原因是,MySQL 宕机了。我尝试手动连接并出现错误:
>mysql -uroot -ppass
ERROR 2003 (HY000): Can't connect to MySQL server on 'localhost' (10061)
Run Code Online (Sandbox Code Playgroud)
我在 Win XP 上使用 MySQL 5.5。为什么会有这种奇怪的行为?
正如标题所说,我在“ON UPDATE CURRENT_TIMESTAMP”方面遇到了一些问题。这是表的 SQL 定义:
CREATE TABLE `judgements` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`parent_id` bigint(20) NOT NULL DEFAULT '0',
`entry_id` bigint(20) NOT NULL,
`group_id` bigint(20) NOT NULL,
`comments` longtext,
`rating` int(11) DEFAULT '0',
`status` int(11) NOT NULL DEFAULT '1',
`modified` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`,`entry_id`,`group_id`),
KEY `group_id` (`group_id`),
KEY `entry_id` (`entry_id`),
KEY `status_id` (`status`),
CONSTRAINT `entry_id` FOREIGN KEY (`entry_id`) REFERENCES `entries` (`id`),
CONSTRAINT `group_id` FOREIGN KEY (`group_id`) REFERENCES `groups` (`id`),
CONSTRAINT `status_id` …Run Code Online (Sandbox Code Playgroud) 我有一张表,如下所示:
CREATE TABLE SomeTable (
id int unsigned NOT NULL AUTO_INCREMENT,
status enum('broken','repaired') NOT NULL,
from datetime NOT NULL,
until datetime NOT NULL,
brought_in timestamp,
brought_by varchar(255) NOT NULL,
repair_status enum('unpayed', 'payed') DEFAULT NULL,
payed_when timestamp,
delivered_when timestamp,
primary key(id)
);
Run Code Online (Sandbox Code Playgroud)
当我创建表时,如果我做了SHOW CREATE TABLE然后我看到列brought_in被定义为具有当前时间戳ON INSERT和ON UPDATE.
但是我没有在我的创建表中添加这样的指令。
为什么它不像其他列那样让它为空?
现在,在每次插入或更新另一列时,它都会添加当前时间戳。我不想要那个。
它不会对其他列执行此操作。我究竟做错了什么?
当我创建表时,创建了一个没有时区的时间戳列。所有导入的时间都在UTC. 现在我想明确添加时区信息,并且我已经更改了该列
ALTER TABLE review ALTER COLUMN review_time TYPE TIMESTAMP WITH TIME ZONE USING review_time AT TIME ZONE 'UTC';
Run Code Online (Sandbox Code Playgroud)
选择现有数据不显示添加的时区信息
review_time
2017-07-28 02:25:44
2017-07-28 03:10:35
2017-07-28 03:11:32
2017-07-28 03:11:35
2017-07-28 03:11:38
2017-07-28 03:11:41
2017-07-28 18:54:54
Run Code Online (Sandbox Code Playgroud)
我是否需要UPDATE对现有数据运行语句?如果需要,语法是什么?
缺少时区信息的输出是由于应用程序本身 (SQLWorkbenchJ) 造成的。查询 frompsql将显示时区
mydb # SELECT review_time FROM review;
review_time
------------------------
2017-08-20 08:00:02+08
2017-07-27 00:45:33+08
2017-07-27 00:45:37+08
2017-07-28 02:24:03+08
2017-07-28 02:24:27+08
2017-07-28 02:24:31+08
2017-07-28 02:25:31+08
Run Code Online (Sandbox Code Playgroud) Date.now()我已经将和其他普通 Unix 时间戳值的结果传递1534360109480到 SQL 中,并通过以下方式运行它们:
"@converted_date" = to_timestamp("@date") AT TIME ZONE 'UTC';
而且它始终如一地返回50591-11-28 22:32:38。
我不明白年份怎么可能是 50591,并且无论如何,日期/时间都不准确。
我究竟做错了什么?
在 mysql 5.7.28 中我创建了一个像这样的表:
create table t1 (
id int not null,
d1 timestamp)
engine=innodb;
Run Code Online (Sandbox Code Playgroud)
它工作正常并创建d1为, 。non-nulldefault value current_timetampon update current_timestamp
但是当我尝试创建具有两个时间戳字段的相同表时,如下所示:
create table t1 (
id int not null,
d1 timestamp,
d2 timestamp)
engine=innodb;
Run Code Online (Sandbox Code Playgroud)
我收到错误:
SQL 错误 (1067):“d2”的默认值无效
为什么只有在添加第二个时间戳字段时才会出现错误?
这是 mysql 中的错误还是某些预期行为?
我的兴趣是用 FSP 为 6 来存储时间。正如我所读到的,这不能用TIMESTAMPorDATETIME数据类型来实现。所以,我有一个double字段来存储microtime函数的输出。
无论如何我可以为这样的字段设置(甚至编写一些代码来创建)默认值吗?
我想使用类似的东西NOW(6)并获取1442059062.065123例如。
例如,我有一个带有时间戳的表:
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自动处理时区差异并为我提供所需的输出吗?
我正在处理从外部源收到的 JSON 文档。在本文档中,有一个timestamp属性对应于timestampPostgreSQL 数据类型的文本格式。换句话说,它可以被转换为timestamp类型:(data->>'timestamp')::timestamp。
我想timestamp在索引中使用该属性。我尝试了以下方法:
create table t
(
data jsonb
);
create index on t(((data->>'timestamp')::timestamp));
Run Code Online (Sandbox Code Playgroud)
我正进入(状态:
ERROR: functions in index expression must be marked IMMUTABLE
Run Code Online (Sandbox Code Playgroud)
为什么是这样?我知道转换为 atimestamptz并不是不可变的,因为本地化配置设置不是静态的,但我无法将该逻辑应用于转换为timestamp.
还有办法将我的timestamp财产放入索引吗?
我正在使用几天前发布的 PostgreSQL 12。
我一直在研究“查看”时间的不同方式以及如何在 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,或者我在这里错过了一些重要的东西?