在实践中在MySQL和PHP中使用Datetime vs Timestamp?


24

我不确定如何将数据类型指定为datetime或timestamp,我想我需要这两个数据,但是在不同的事件上。我的网站在全球范围内销售产品和服务,并且还具有一个供用户登录的帐户系统。请澄清以下内容:

  • 客户从我的网站上购买产品的当前日期和时间:日期时间?
  • 根据其位置和购买的日期/时间(根据我们的系统计算得出)的交货日期和时间:日期时间?
  • 他们上次登录自己的帐户:时间戳记?

    1. PHP中存储购买日期(当前日期)然后存储在数据库中的代码是什么?
    2. 请详细说明如何使用它们,因为在互联网上阅读了大量解释后,我仍然不太了解。

前阵子我有一个大的项目,其中的演出是绝对必要的,数月的研究后,我们结束了与存储在一个varchar字段UTC时间戳下去,它被证明是更快,更好地为我们的需求(大社交网络)
JasonDavis

Answers:


29

MySQL 时间戳

  • 存储在UTC中

    它们在存储时转换为UTC,并在检索时转换回您的时区。如果更改时区设置,则检索到的值也会更改。

  • 可以自动初始化和更新

    您可以将其默认值和/或自动更新值设置为 CURRENT_TIMESTAMP

  • 范围1970-01-01 00:00:01 UTC2038-01-19 03:14:07 UTC

而MySQL 日期时间

  • 您所存储的就是您所得到的™。

  • 范围1000-01-01 00:00:009999-12-31 23:59:59

    超出范围的值可能会起作用-但只能保证范围内的值起作用。

  • 您可以将日期或日期存储为零的日期。

    这是MySQL存储生日的方式!您不能使用a来做到这一点,TIMESTAMP唯一的例外是的零值0000-00-00

  • 您可以根据需要以ALLOW_INVALID_DATES模式存储无效日期。

  • NOW()在某些情况下,您可以将默认值设置为,但是自动初始化和更新日期的首选方法更为自然TIMESTAMP

而且当然还有DATEand TIME,它们的工作方式与相似DATETIME,但是当然DATE不关心时间,TIME也不关心日期。所有这四种数据类型均可与各种日期和时间函数完美配合,但是在混合数据类型时,应注意转换效果

现在,您的问题是:您应该DATETIME在各处使用它。并非出于技术原因,但是由于您仍不清楚MySQL的工作方式,因此DATETIME是较简单的选择。这意味着您必须在存储之前计算PHP中的当前时间戳,这很容易:

$mysqldate = date("Y-m-d H:i:s"); 

PHP的date函数的工作方式如下:

string date ( string $format [, int $timestamp = time() ] )

"Y-m-d H:i:s"格式是一种与MySQL兼容的格式,将第二个参数保留为空,可以date()调用time()以获得当前的UNIX时间戳

使用a TIMESTAMP代替a DATETIME具有MySQL的附加值,以承担决定当前时间戳的责任,并且您可以在插入/更新时跳过该字段。但是,由于您已经在发送查询,并且获取PHP当前时间戳的代码很少,因此您可以放心使用DATETIME所有内容。

至于将PHP时间戳存储到数据库中的实际代码,您应该查看PHP数据对象,如果仍然不清楚,请询问StackOverflow。但是已经有将近1.5k的相关问题,请确保在提出问题之前先进行遍历。只是一个提示,准备好的陈述就是很棒的孩子如何做到的。


嗯,这可能是您如何将查询发送到MySQL或表结构的问题。StackOverflow是解决此类问题的好地方,在其中用表结构和完整的php代码发布问题,以及有关问题是什么以及您已经尝试过的内容的一些详细信息。我们在这里没有真正讨论实现细节...
yannis 2011年

感谢您的回复。我试过使用$ mysqldate = date(“ Ymd H:i:s”); $ query =在我的php代码上插入表VALUE('.. $ mysqldate。“'),但它将在MySQL中以注册00:00:00保留在Date(field)-Datetime(datatype)中。我打算存储当前的日期和时间。如果我在数据库中将数据类型设置为Timestamp,如何在php中编码?
模块化的

目前,我不允许在Stackoverflow上发表任何评论。听起来有点可耻,但这就是他们对我的做法。
模块化的

对此感到抱歉,但是如果您处于临时暂停模式,则一定有充分的理由。现在,您评论中的代码中可能存在的一个错误是,您将字段命名为Date,这是DATE数据类型的保留字,可能会发生奇怪的事情(取决于MySQL版本),因此请尝试将其重命名为类似的东西,creationdate然后看看会发生什么情况。同样,从PHP中,您应该将TIMESTAMP字段与DATETIME字段一样对待,这并不重要。它们的格式是相同的。
yannis 2011年

太感谢了。经过一整夜的努力,找出原因之后,现在对它进行了排序。:)
模块化

2

从本文引用:

主要区别:

TIMESTAMP用于跟踪记录的更改,并在每次记录更改时进行更新。DATETIME用于存储不受记录更改影响的特定和静态值。

TIMESTAMP还受与TIME ZONE相关的其他设置的影响。DATETIME是常数。

TIMESTAMP在内部将当前时区转换为UTC进行存储,并在检索过程中将其转换回当前时区。DATETIME无法做到这一点。

支持的TIMESTAMP范围:'1970-01-01 00:00:01'UTC到'2038-01-19 03:14:07'UTC DATETIME支持的范围:'1000-01-01 00:00:00'到'9999 -12-31 23:59:59′


1
那么在2040年,您将使用什么来更改记录(时间戳)?我猜不会。
森2015年

-1

好吧,我以非常简单的方式看待它。在您的情况下,我会同时使用datetimetimestamp。结合使用这两种方法,您将不会在存储数据或类似的事情上遇到任何其他问题。表中的另一个字段(列)也不是大问题。

因此,以目前的观点和经验来看,我通常会同时使用两者。当您想向访客显示日期或使访客易于理解时,请以日期时间格式显示日期。

当您要计算某些内容时,Datetime格式可能会很麻烦(两个日期之间的差异,从当前日期获取昨天的日期,从当前日期获取1周前的日期,获取明天的日期之类的东西。)这并不难,但通常您会需要先将它们转换为内容timestamp,然后再进行处理。是的,例如,您获得的当前日期时间是:$current = date("Y-m-d");或者,$current = date("Y-m-d H:i:s");如果您还想要小时,分钟和秒。

时间戳只是一个11位数长的数字,实际上并没有“表示”任何意思。当您查看它时,您将不知道它代表的日期。因此,它并不是真正的用户友好型,您不能仅使用它来回显并将其显示给访问者。您将需要将其“转换”为可读的内容。但是,它还为您提供了轻松转换和计算不同日期的功能。例如,如果您想同时获取明天的时间戳,则只需将秒数添加到当前日期,便可以获取明天的时间戳。示例:$tomorrow = time()+24*3600;您还可以轻松地获得以秒为单位的两个日期之间的时差或类似的值。

所以我建议同时使用datetime和timestamp。即使您使用例如PhpMyadmin并希望快速查看一些数据,当您以日期时间格式(例如2011-12-20 10:15:20:)查看日期时,也将变得更加容易,就像您只看11位数字一样。因此,请同时使用两者,然后致电并使用更适合您的一种。

如果必须或仅选择一个,则建议使用时间戳,否则请同时使用。


1
-1 Timestamp is just a number 11 digit long which doesn't really "mean" anythingMySQL时间戳以与datetime相同的格式存储。您还需要将它们转换为php时间戳,以执行您描述的计算,或者仅使用MySQL的许多日期/时间函数并在数据库中进行计算。您的答案实际上没有任何意义。
yannis 2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.