我希望我的产品与其他所有网络产品一样,从我的数据库中提取数据信息并将其转换为用户的时区,然后再将其显示在页面上。我正在使用PHP和MySQL。
使用TIMESTAMP字段比使用DATETIME字段更常见吗?
根据我的研究,似乎使用DATETIME字段,我必须
date_default_timezone_set('UTC')
对我的日期字段使用TIMESTAMPS,似乎我只需要在建立数据库连接时运行以下命令:SET time_zone ='users userszone'(例如America / Los_Angelos)。
考虑到这一点,我推断大多数人会倾向于使用TIMESTAMP而不是DATETIME ...这是准确的吗?
答案 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的自动行为,否则请使用DATETIME
。 DATETIME
也可以代表更大的范围。