TIMESTAMPS相对于DATETIME字段有多常见?

时间:2009-06-15 21:36:05

标签: php mysql timezone

我希望我的产品与其他所有网络产品一样,从我的数据库中提取数据信息并将其转换为用户的时区,然后再将其显示在页面上。我正在使用PHP和MySQL。

使用TIMESTAMP字段比使用DATETIME字段更常见吗?

根据我的研究,似乎使用DATETIME字段,我必须

  1. 以UTC格式存储所有日期信息
  2. 每次应用程序启动时调用date_default_timezone_set('UTC')
  3. 从使用date()基于当前日期/时间创建的日期手动减去用户的UTC偏移小时数
  4. 从传递给date()
  5. 格式的现有日期手动减去用户的UTC偏移小时数

    对我的日期字段使用TIMESTAMPS,似乎我只需要在建立数据库连接时运行以下命令:SET time_zone ='users userszone'(例如America / Los_Angelos)。

    考虑到这一点,我推断大多数人会倾向于使用TIMESTAMP而不是DATETIME ...这是准确的吗?

5 个答案:

答案 0 :(得分:2)

this位置:

  

SQL Server时间戳数据类型具有   与时间或日期无关。 SQL   服务器时间戳是二进制数   表示相对序列   哪些数据修改发生在   一个数据库。时间戳数据类型   最初实施是为了支持   SQL Server恢复算法。

编辑:为了回答您的问题,DATETIME更常用,因为TIMESTAMP不打算用于存储一般的日期/时间信息。

答案 1 :(得分:2)

不,我认为这不准确。

通常,您使用日期时间来存储 - 发生某些事情的日期和时间,当它进入您的网站时。您可以使用时间戳来跟踪何时将数据输入您的站点以供程序使用。时间戳不应该跟踪时区,因为所有的工作都发生在数据库服务器的时区 - 而datetime有更多的选项可以正确地呈现它,以便它作为输出给用户。

因此,对于“哪个更常见的呈现用户时区数据”这个问题,我会说答案是DATETIME。

答案 2 :(得分:1)

TIMESTAMP字段通常用于支持并发检查。当用户通过表单或其他机制修改表记录时,数据库知道它正在更新用户刚刚读取的相同记录,因为用户提交的TIMESTAMP记录更改匹配数据库记录中的TIMESTAMP。

如果另一个用户在第一个用户执行保存之前修改了记录,则第一个用户读取的TIMESTAMP将不再与数据库中的TIMESTAMP匹配。接下来会发生什么取决于系统如何处理并发冲突。有些系统会阻止保存。其他系统会询问第一个用户是否要覆盖其他人的更改。

答案 3 :(得分:1)

如果您需要进行时区操作,并且您不需要在1970年之前或2038年之后存储日期,请使用TIMESTAMP。

您可以执行单个SQL语句:

set timezone='America/New_York';

从数据库中检索的所有日期都将在EDT中。

我会避免进行UTC偏移数学运算,因为很难正确处理所有情况。最好的办法是为每个用户设置适当的PHP和MySQL时区。

TIMESTAMPs仅将日期存储为UTC,MySQL会为其处理翻译。

存储日期时:

set time_zone='America/New_York';
insert into SomeTable ( Name, Created, Modified ) VALUES ( 'Dude', '2009-06-15 11:54:00', '2009-06-15 11:54:00');
set time_zone='GMT';
SELECT * FROM SomeTable ORDER BY ID DESC LIMIT 1;
+----+------+---------------------+---------------------+
| ID | Name | Created             | Modified            |
+----+------+---------------------+---------------------+
|  1 | Dude | 2009-06-15 15:54:00 | 2009-06-15 15:54:00 | 
+----+------+---------------------+---------------------+

只需将数据库时区设置为用户所在的区域,它就会将其“正确”“转换”到正确的GMT日期。

请确保您不要在PHP和MySQL中“双转换”日期。

答案 4 :(得分:0)

TIMESTAMP的特殊之处在于它可以在创建或行更改时自动更新。请参阅timestamp docs

基本上,除非您想要MySQL的自动行为,否则请使用DATETIMEDATETIME也可以代表更大的范围。