26

我一生都在使用unix时间戳。

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

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

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

谢谢。

4

7 回答 7

32

如果您将日期作为 Unix 时间戳存储在数据库中,那么您将承担繁重的工作。您必须将它们转换为您想要使用的格式,您必须在日期范围之间进行计算,您必须构建查询以获取某个范围内的数据。这似乎违反直觉——你的“程序员时间”肯定最好花在解决实际问题上吗?

以 MySQL 可用的正确格式存储日期和时间,然后使用数据库函数为您想要的数据创建查询,这似乎是更好的做法。与花在阅读(和理解) 11.6 MySQL 日期和时间函数的下午所花费的时间相比,您将浪费在进行所有转换和捣乱上的时间是巨大的

于 2009-07-12T18:04:53.157 回答
9

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

  1. 日期时间字段的大小是整数的两倍
  2. 按整数排序更快(不是 100% 肯定,这个问题的未决结果

但是,对于另一个系统,我必须存储交易信息。这使得使用内部 mysql 日期函数成为可能,这在我们必须开始做报告时非常有用。

于 2014-11-07T06:08:17.003 回答
7

使用MySQL 日期/时间类型的一个优点是能够更简单地使用MySQL 中的日期/时间函数

DATE类型还具有仅存储日、月和年的优点,因此不会浪费空间或比较复杂的情况,因为您只关心日期而不是时间。

就我个人而言,我倾向于将数据库用作数据的转储,因此对此类功能没什么兴趣。在 PHP 中,出于您陈述的原因,我倾向于仅以整数格式存储日期。

于 2009-07-12T17:56:19.773 回答
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). 

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

@treznik 不久前,出于上述原因,我从 uts 整数转换为 datetime 或 timestamp 数据类型,因为它们更容易阅读和操作(我做了很多直接表访问)。然而,我最近开始重新考虑这种方法,原因有两个:

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

我自己还在努力寻找答案。

于 2012-05-23T10:50:10.580 回答
3

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

说我的查询是:

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

我需要运行:

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

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

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

于 2010-02-10T16:28:05.843 回答
2

更容易维护是一个优点。查看实际日期:

select * from table where ...

很不错。

于 2009-07-12T17:59:17.490 回答
1

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

于 2009-07-12T17:58:41.080 回答