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

时间:2009-07-12 17:54:08

标签: mysql datetime unix-timestamp

我一直在使用unix时间戳。

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

现在,有些人说最好使用DATETIME格式。但除了更合适的名字外,我看不出任何优势。

使用DATETIME确实更好,如果有,有什么好处?

感谢。

7 个答案:

答案 0 :(得分:31)

如果您将日期作为Unix时间戳存储在数据库中,那么您将给自己带来繁重的负担。您必须将它们转换为您要使用的格式,您必须在日期范围之间进行计算,您必须构建查询以获取范围内的数据。这似乎是违反直觉的 - 当然,你的“程序员时间”最好用于解决实际问题吗?

以MySQL提供的正确格式存储日期和时间似乎更好的做法,然后使用数据库函数为您想要的数据创建查询。与下午阅读(和理解)11.6 MySQL Date and Time Functions

相比,你浪费所有的转换和捣乱的时间是巨大的。

答案 1 :(得分:8)

我一直都是unix时间戳的忠实粉丝。但我认为正确答案是:"取决于"。我最近做了一个表数据库,我只想列出URL。会有一个日期字段,但日期字段纯粹用于排序。即按last_crawled排序。这意味着我永远不会在该字段上使用任何内置日期函数。它只是一种简单的方法来获取最早的条目,我永远不会将日期函数应用于此字段。现在,如果我把它作为日期字段,我会失去两件事:

  1. 日期时间字段是整数
  2. 的两倍
  3. 按整数排序更快(不是100%肯定,pending outcome of this question
  4. 但是,对于另一个系统,我必须存储交易信息。这使得使用internal mysql date functions成为可能,当我们不得不开始做报告时,它变得非常有用。

答案 2 :(得分:7)

使用MySQL date/time types的一个好处是可以更简单地使用date/time functions in MySQL

DATE类型的优点还在于它只存储日,月和年,因此没有浪费空间或比较并发症,因为在你只关心这一天的情况下,纪元时间会有几秒钟而不是时间。

就个人而言,我倾向于使用数据库作为数据转储,因此这些功能不太重要。在PHP中,我倾向于只以整数格式存储日期,这几乎是你说的原因。

答案 3 :(得分:6)

@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). 

这样做将使用适当的表索引。

不久前@preznik我从一个uts整数转移到了datetime或timestamp数据类型,由于上面提到的原因,它们更容易阅读和操作(我做了很多直接的表访问) 。但是我最近开始重新考虑这种方法有两个原因:

  1. 没有存储时区位置,因此您根据您的位置推断时区。这对您来说可能是也可能不是问题。
  2. 忽略了夏令时。因此,当时钟在凌晨2点返回时,您将在凌晨1:30凌晨两次,并且说2011-10-30 01:30不会让您知道这一点,而1319938200则不然。我不认为在mysql中存在一种本地方式来存储日期,包括时区,除了字符串(2011-10-30 01:30 BST)。
  3. 我仍在努力找出答案,我自己。

答案 4 :(得分:3)

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

说我的查询是:

从表中选择col1,col2,colUnixdatetime,其中colvdate1和wtvdate2之间的colUnixdatetime

我需要运行:

从wtvdate1和wtvdate2之间的From_Unixtime(colUnixdatetime)表中选择col1,col2,colUnixdatetime

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

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

答案 5 :(得分:2)

更容易维护。查看实际日期:

select * from table where ...

非常好。

答案 6 :(得分:1)

比较容易,而且mysql提供了很多日期功能。