你会推荐使用 约会时间 或者a 时间戳 字段,为什么(使用MySQL)?
我在服务器端使用PHP。
MySQL中的时间戳通常用于跟踪记录的更改,并且通常在每次更改记录时更新。如果要存储特定值,则应使用datetime字段。
如果您想要在使用UNIX时间戳或本机MySQL日期时间字段之间做出决定,请使用本机格式。您可以通过这种方式在MySQL中进行计算
("SELECT DATE_ADD(my_datetime, INTERVAL 1 DAY)")
并且可以很容易地将值的格式更改为UNIX时间戳 ("SELECT UNIX_TIMESTAMP(my_datetime)")
当你查询记录时,如果你想用PHP操作它。
在MySQL 5及以上版本中, TIMESTAMP 值从当前时区转换为UTC以进行存储,并从UTC转换回当前时区以进行检索。 (这仅适用于TIMESTAMP数据类型,并且 不 对于其他类型,如DATETIME。)
默认情况下,每个连接的当前时区是服务器的时间。时区可以基于每个连接进行设置,如中所述 MySQL服务器时区支持。
我总是将DATETIME字段用于行元数据以外的任何内容(创建或修改日期)。
如 提到 在MySQL文档中:
当您需要包含日期和时间信息的值时,将使用DATETIME类型。 MySQL以'YYYY-MM-DD HH:MM:SS'格式检索并显示DATETIME值。支持的范围是'1000-01-01 00:00:00'到'9999-12-31 23:59:59'。
...
TIMESTAMP数据类型的范围为'1970-01-01 00:00:01'UTC到'2038-01-09 03:14:07'UTC。它具有不同的属性,具体取决于MySQL版本和运行服务器的SQL模式。
在一般情况下,你很有可能达到TIMESTAMPs的下限 - 例如存储生日。
以下示例显示了如何 TIMESTAMP
更改后,日期类型更改了值 time-zone to 'america/new_york'
哪里 DATETIME
没有改变。
mysql> show variables like '%time_zone%';
+------------------+---------------------+
| Variable_name | Value |
+------------------+---------------------+
| system_time_zone | India Standard Time |
| time_zone | Asia/Calcutta |
+------------------+---------------------+
mysql> create table datedemo(
-> mydatetime datetime,
-> mytimestamp timestamp
-> );
mysql> insert into datedemo values ((now()),(now()));
mysql> select * from datedemo;
+---------------------+---------------------+
| mydatetime | mytimestamp |
+---------------------+---------------------+
| 2011-08-21 14:11:09 | 2011-08-21 14:11:09 |
+---------------------+---------------------+
mysql> set time_zone="america/new_york";
mysql> select * from datedemo;
+---------------------+---------------------+
| mydatetime | mytimestamp |
+---------------------+---------------------+
| 2011-08-21 14:11:09 | 2011-08-21 04:41:09 |
+---------------------+---------------------+
我已将我的答案转换成文章,以便更多人发现这有用, MySQL:日期时间与时间戳数据类型。
主要区别在于DATETIME是常量而TIMESTAMP受到影响 time_zone
设置。
因此,只有当您拥有 - 或者将来可能 - 跨时区同步集群时,这才有意义。
用简单的话说: 如果我在澳大利亚有一个数据库,并且转储该数据库以同步/填充美国的数据库,则TIMESTAMP将更新以反映新时区中事件的实际时间,而DATETIME仍将反映时间在au时区的事件。
应该使用TIMESTAMP的DATETIME的一个很好的例子是在Facebook,他们的服务器永远不能确定跨时区发生的时间。一旦我正在进行对话,其中时间说我在实际发送消息之前回复了消息。 (当然,这也可能是由于消息传递软件中的时区转换不正确而导致发布时间而不是同步。)
我在语义基础上做出这个决定。
当我需要记录(或多或少)固定时间点时,我使用时间戳。例如,当记录插入数据库或发生某些用户操作时。
当日期/时间可以任意设置和更改时,我使用日期时间字段。例如,当用户可以保存以后更改约会时。
对于DATETIME,TIMESTAMP是4字节Vs 8字节。
http://dev.mysql.com/doc/refman/5.0/en/storage-requirements.html
但是像scronide说它确实有一个1970年的下限。它对于未来可能发生的任何事情都很好;)
对于DATETIME,TIMESTAMP是四个字节对八个字节。
时间戳在数据库上也更轻,索引速度更快。
当您需要包含日期和时间信息的值时,将使用DATETIME类型。 MySQL以'YYYY-MM-DD HH:MM:SS'格式检索并显示DATETIME值。支持的范围是'1000-01-01 00:00:00'到'9999-12-31 23:59:59'。
TIMESTAMP数据类型的范围为'1970-01-01 00:00:01'UTC到'2038-01-09 03:14:07'UTC。它具有不同的属性,具体取决于MySQL版本和运行服务器的SQL模式。
我推荐使用 也不 DATETIME或TIMESTAMP字段。如果你想要表示一个特定的日子(如生日),那么使用DATE类型,但如果你比这更具体,你可能有兴趣记录一个实际的时刻,而不是一个单位的时间(日,周,月,年)。使用BIGINT而不是使用DATETIME或TIMESTAMP,只需存储自纪元以来的毫秒数(如果您使用的是Java,则为System.currentTimeMillis())。这有几个好处:
此问题与您应如何在数据库中存储货币价值(即1.99美元)密切相关。你应该使用Decimal,还是数据库的Money类型,或者最糟糕的Double?由于上面列出的许多相同原因,所有这三个选项都很糟糕。解决方案是使用BIGINT将货币价值存储在美分中,然后在向用户显示价值时将美分转换为美元。数据库的工作是存储数据,而不是用于表示数据。您在数据库(尤其是Oracle)中看到的所有这些奇特的数据类型几乎没有增加,并开始向供应商锁定。