从PHP中存储MySQL日期的最佳实践
我一直在使用unix时间戳。从PHP中存储MySQL日期的最佳实践
我喜欢它,因为它很容易比较,速度很快,因为我将它作为整数存储。而且由于我使用的是PHP,我可以使用unixtimestamp中的date()函数获取任何日期/时间格式。
现在,有人说最好使用DATETIME格式。但除了更适合的名字,我没有看到任何优势。
使用DATETIME确实比较好,如果是的话,有什么优势?
谢谢。
如果您将日期作为Unix时间戳存储在数据库中,那么您会给自己沉重的负担。您必须将它们转换为您要使用的格式,您必须在日期范围之间进行计算,您必须构建查询以获取范围内的数据。这似乎与直觉相反 - 当然,你的“程序员时间”最好花在解决实际问题上?
看起来好得多的做法是将日期和时间以MySQL可用的正确格式存储,然后使用数据库函数为您想要的数据创建查询。浪费时间做所有转换和浪费的时间相对于下午花费的阅读(和理解)来说是巨大的11.6 MySQL Date and Time Functions
使用MySQL date/time types的一个优点是能够更简单地使用date/time functions in MySQL。
DATE
类型的优点还在于,它仅存储日,月和年,因此不会浪费空间或比较并发症,因为在您只关心当天而不是时间的情况下,时间。
就我个人而言,我倾向于使用数据库作为数据转储,因此这些功能没有多大意义。在PHP中,我倾向于以整数格式存储日期,这与您陈述的原因很相似。
比较容易,mysql提供了很多日期函数。
更容易维护是一个优点。看到你的实际日期:
select * from table where ...
是相当不错的。
使用数据库日期时间更有效,因为每次需要查询时都需要应用from_unixtime()函数从表的unix日期时间列中提取数据。在where子句中使用此函数将完全忽略任何索引用法。
说我的查询是:
选择COL1,COL2,colUnixdatetime from表where wtvdate1之间colUnixdatetime和wtvdate2
我需要运行:
选择COL1,COL2,colUnixdatetime from表where from_Unixtime(colUnixdatetime)wtvdate1和wtvdate2之间
这上面的查询将完全忽略任何索引,以及没有使用索引在这里,因为他们永远不会被使用因为我将永远需要我们e是获取真实日期时间的函数。
任何在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整数移动到一个日期时间或时间戳数据类型,出于上述原因,因为他们更容易阅读和操作(我做了很多直接表访问)。不过我最近开始重新考虑这种做法的原因有两个:
- 没有时区位置存储,所以你推断基于您位置的时区。这对你来说可能是也可能不是问题。
- 它忽略夏令时。所以,当时钟在凌晨2点回来时,你会在凌晨1点半得到两次,并说2011-10-30 01:30不会让你知道这一点,而1319938200则会。我不认为有一个本地的方式在MySQL中存储包括时区在内的日期,除了作为一个字符串(2011-10-30 01:30 BST)。
我还在试图找出答案,我自己。
我一直都是unix时间戳的狂热粉丝。但我认为正确的答案是:“依赖”。我最近做了一个表格数据库,我只想列出URL。会有一个日期字段,但日期字段纯粹是为了排序。我通过last_crawled命令。这意味着我永远不会在该字段上使用任何内置日期函数。这只是一个简单的方法来获取最早的条目,我绝不会将日期函数应用于此字段。现在,有我在此日期字段,我就失去了两件事情:
- 时间字段是一个整数
- 一个整数排序的两倍快(不是100%肯定的这个,pending outcome of this question)
但是,对于另一个系统,我不得不存储交易信息。这使得使用internal mysql date functions成为可能,这在我们开始做报告时变得非常有用。
我站好了。 :) – treznik 2009-07-13 07:43:04
我不同意。检查我的答案。 – coderama 2014-11-07 06:08:40