我试图在MySQL表中节省一段时间。然而,日期恢复到2000-01-01年。
1.9.2p320 :036 > vv = Visitor.new
=> #<Visitor id: nil, ip_address: nil, num_day_visits: nil, last_visit: nil>
1.9.2p320 :037 > vv.last_visit = Time.now; vv.ip_address = "3.3.3.3"
=> "3.3.3.3"
1.9.2p320 :038 > vv.num_day_visits = 1
=> 1
1.9.2p320 :039 > vv
=> #<Visitor id: nil, ip_address: "3.3.3.3", num_day_visits: 1, last_visit: "2012-10-11 01:31:04">
1.9.2p320 :040 > vv.save
SQL (0.2ms) BEGIN
SQL (0.7ms) INSERT INTO `visitors` (`ip_address`, `last_visit`, `num_day_visits`) VALUES (?, ?, ?) [["ip_address", "3.3.3.3"], ["last_visit", 2012-10-11 01:31:04 -0400], ["num_day_visits", 1]]
(0.5ms) COMMIT
=> true
1.9.2p320 :042 > vv
=> #<Visitor id: 1199, ip_address: "3.3.3.3", num_day_visits: 1, last_visit: "2012-10-11 01:31:04">
1.9.2p320 :043 > Visitor.find(:all,:conditions=>{:ip_address => "3.3.3.3"})
Visitor Load (1.4ms) SELECT `visitors`.* FROM `visitors` WHERE `visitors`.`ip_address` = '3.3.3.3'
=> [#<Visitor id: 1199, ip_address: "3.3.3.3", num_day_visits: 1, last_visit: "2000-01-01 05:31:04">] 所以当我检索记录的时候,日期是2000-01-01。
MySQL中的表格:
mysql> describe visitors ;
+----------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| ip_address | varchar(255) | NO | | NULL | |
| num_day_visits | int(11) | NO | | NULL | |
| last_visit | time | NO | | NULL | |
+----------------+--------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)更新:我创建了一个玩具表,用于从时间到日期的转换。这就是发生的事情:
mysql> select * from example ;
+----+----------+
| id | mytime |
+----+----------+
| 1 | 11:13:00 |
+----+----------+
1 row in set (0.00 sec)
mysql> alter table example change mytime mytime datetime;
Query OK, 1 row affected, 1 warning (0.02 sec)
Records: 1 Duplicates: 0 Warnings: 1
mysql> select * from example ;
+----+---------------------+
| id | mytime |
+----+---------------------+
| 1 | 0000-00-00 00:00:00 |
+----+---------------------+
1 row in set (0.00 sec)这就破坏了价值。我试图通过按时间更改表,并使用新的行来返回。重新开始:
mysql> select * from example ;
+----+----------+
| id | mytime |
+----+----------+
| 2 | 11:13:00 |
+----+----------+
1 row in set (0.00 sec)
mysql> ALTER TABLE example CHANGE mytime mytime DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP();
ERROR 1067 (42000): Invalid default value for 'mytime'
mysql> ALTER TABLE example CHANGE mytime mytime DATETIME NOT NULL DEFAULT CURRENT_DATE();
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'CURRENT_DATE()' at line 1显然,this is hard。
发布于 2012-10-11 06:00:28
这是因为您的last_visit列是time而不是datetime类型的。最初,我假设mysql只是使用01-01-2000作为内部表示时间字段的默认日期,但是看起来01-01-2000是rails的操作,而不是mysql。看看Represent a time with no date in ruby
发布于 2012-10-11 06:01:43
在mysql提示符下运行此命令,
更改表访问者更改last_visit last_visit日期时间;
发布于 2012-10-11 16:14:56
用Ashish和Beck的答案来理解我的问题,我只是将时间存储在MySQL中,rails在默认的2000-01-01中添加了时间。我试图找到一种方法来更新现有数据,包括日期,使用今天的日期更新记录。下面是我可以得到的。
假设我们有
mysql> select * from example ;
+----+----------+
| id | mytime |
+----+----------+
| 2 | 11:13:00 |
+----+----------+
1 row in set (0.00 sec)这就是我如何将mytime更改为更新的日期时间的方式。
mysql> alter TABLE example ADD new_time datetime;
Query OK, 1 row affected (0.04 sec)
mysql> UPDATE example SET new_time = CONCAT( CURDATE(), " ", mytime );
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> ALTER TABLE example DROP mytime ;
Query OK, 1 row affected (0.03 sec)
Records: 1 Duplicates: 0 Warnings: 0
mysql> ALTER TABLE example CHANGE new_time mytime DATETIME;
Query OK, 1 row affected (0.04 sec)
Records: 1 Duplicates: 0 Warnings: 0
mysql> select * from example ;
+----+---------------------+
| id | mytime |
+----+---------------------+
| 2 | 2012-10-11 11:13:00 |
+----+---------------------+
1 row in set (0.00 sec)在一个例子中,我找不到一种方法来组合数据更新和更改字段类型。有人有更好的主意吗?
https://stackoverflow.com/questions/12832857
复制相似问题