从PHP在MySQL中存储日期的最佳实践

从PHP在MySQL中存储日期的最佳实践,mysql,datetime,unix-timestamp,Mysql,Datetime,Unix Timestamp,我一生都在使用unix时间戳 我喜欢它,因为它很容易比较,它很快,因为我把它存储为一个整数。因为我使用的是PHP,所以我可以从unixtimestamp使用date()函数获取任何日期/时间格式 现在,有些人说最好使用DATETIME格式。但除了更合适的名字,我看不出有什么好处 使用DATETIME是否确实更好?如果是,其优点是什么 谢谢。使用的一个优点是能够更简单地使用 DATE类型的另一个优点是,它只存储日、月和年,因此不会浪费空间,也不会出现比大纪元时间后几秒钟内只关心日而不关心时间的情况

我一生都在使用unix时间戳

我喜欢它,因为它很容易比较,它很快,因为我把它存储为一个整数。因为我使用的是PHP,所以我可以从unixtimestamp使用date()函数获取任何日期/时间格式

现在,有些人说最好使用DATETIME格式。但除了更合适的名字,我看不出有什么好处

使用DATETIME是否确实更好?如果是,其优点是什么


谢谢。

使用的一个优点是能够更简单地使用

DATE
类型的另一个优点是,它只存储日、月和年,因此不会浪费空间,也不会出现比大纪元时间后几秒钟内只关心日而不关心时间的情况更复杂的比较


就我个人而言,我倾向于使用数据库作为数据转储,因此对此类函数不感兴趣。在PHP中,我倾向于以整数格式存储日期,原因与您陈述的差不多。

更易于比较,mysql提供了许多日期函数。

更易于维护是一个优势。在执行以下操作时查看实际日期:

select * from table where ...

非常好。

如果您将日期存储为数据库中的Unix时间戳,那么您将承受沉重的负担。您必须将它们转换为您想要使用的格式,必须在日期范围之间进行计算,必须构建查询以获取范围内的数据。这似乎有悖常理——难道你的“程序员时间”最好花在解决实际问题上吗


以MySQL提供的适当格式存储日期和时间,然后使用数据库函数创建所需数据的查询,这似乎是更好的做法。与下午花在阅读(和理解)上的时间相比,您浪费在所有转换和闲逛上的时间是巨大的。

使用数据库datetime效率更高,因为每次需要查询时,您都需要应用from_unixtime()函数从表的unix datetime col中提取数据。在where子句中使用此函数将完全忽略任何索引用法

假设我的问题是:

从表中选择col1、col2、colUnixdatetime,其中colUnixdatetime介于wtvdate1和wtvdate2之间

我需要运行:

从表格中选择col1、col2、colUnixdatetime,其中wtvdate1和wtvdate2之间的from_nixTime(colUnixdatetime)

上面的查询将完全忽略任何索引,这里没有使用索引,因为它们永远不会被使用,因为我将始终必须使用函数来获取实时日期


where子句中条件LHS上使用的任何内置函数都不会使用任何索引,如果您有一个大表,查询将花费更长的时间。

@Smita V,您提到的低效查询之所以如此,是因为您将转换函数错误地应用于每个表行,您应该将其应用于条件本身。所以不是

select col1,col2,colUnixdatetime from table where From_Unixtime(colUnixdatetime) between wtvdate1 and wtvdate2
,它转换表中的每一行,以将其与您得到的日期进行比较。你应该使用

select col1,col2,colUnixdatetime from table where colUnixdatetime between UNIX_TIMESTAMP(wtvdate1) and UNIX_TIMESTAMP(wtvdate2). 
这样做将使用适当的表索引

@treznik不久前,由于上述原因,我将uts整数转换为datetime或timestamp数据类型,因为它们更易于读取和操作(我进行了大量的直接表访问)。然而,我最近开始重新思考这种方法,原因有两个:

  • 没有存储时区位置,因此您根据您的位置推断时区。这可能是你的问题,也可能不是
  • 它忽略了夏令时。所以当时钟回到凌晨2点时,你会得到两次凌晨1:30,说2011-10-30 01:30不会让你知道这一点,而1319938200会。我不认为mysql中有一种原生的方式来存储包含时区的日期,除了作为字符串(2011-10-30 01:30 BST)

  • 我自己仍在努力找出答案。

    我也是unix时间戳的忠实粉丝。但我认为正确的答案是:“视情况而定”。我最近做了一个单表数据库,我只想列出URL。将有一个日期字段,但日期字段纯粹用于排序。即按上次爬网的顺序。这意味着我永远不会在该字段上使用任何内置的日期函数。这只是一种简单的方法,可以先获取最旧的条目,我永远不会将日期函数应用于此字段。现在,如果我将此字段设为日期字段,我将在两个方面失去优势:

  • datetime字段的大小是整数的两倍
  • 按整数排序更快(不是100%确定,)

  • 然而,对于另一个系统,我必须存储事务信息。这使得使用成为可能,当我们不得不开始做报告时,这是非常有用的。

    告诉我吧,真不敢相信这是将近3年前的事了。在我开始这个帖子后不久,我也切换到了datetime,但从未真正相信它是正确的选择。我经常遇到你提到的同样的问题,我仍然认为时间戳是最终的选择。但我想有时候,为了完成任务,我们需要让步,采用最实际的解决方案。虽然datetime没有时区,但我们将日期存储为UTC,并在应用层或使用convert_tz()转换为适当的时区。这解决了您的两个问题。此外,我认为datetime实际上比timestamp更可靠,因为我知道该值始终是我存储的值(UTC),而不是存储为UTC但转换为服务器时区(可能会更改)的timestamp。我不同意。检查我的答案。MySQL的DATETIME字段缺少时区-始终以UTC存储日期(即避免现在()-使用UTC_TIMESTAMP()),否则,当您尝试国际化应用程序以及出于任何原因更改服务器时区时,您将陷入一片混乱。