针对特定时间点的MySQL字段类型

问题描述:

我需要一个能够及时存储特定日期的MySQL列。我正在使用的应用程序为我提供了一个UNIX时间戳(自1970年1月1日起已经过去的秒数)。我需要将这些信息存储在数据库中,稍后以特定的方式检索它,如下所示。针对特定时间点的MySQL字段类型

在这个日期被存储之后,我需要能够根据这个时间戳来查询数据库。例如,我需要能够检索时间戳的第4天的所有行。

那么我的问题是我该如何存储这个日期,这将是最容易执行查询? DATETIME和TIMESTAMP对我来说似乎是有效的选项,但我似乎无法弄清楚如何处理查询。我不希望将时间戳存储为整数,因为它不允许我创建这样的查询,我不得不将该工作卸载到PHP。

如果有帮助,我需要在UTC时间处理这些时间戳。我知道TIMESTAMP会为我进行PST转换(我的本地时间),所以我不得不在MySQL或PHP中转换回UTC。 (至少我想我会)

请帮忙!

如果我是你,我将这些数据的保存为DateTime。原因是

  • 记录可以用我们自己的眼睛阅读。例如2013-01-04 00:25:121357259112好。
  • 不必使用任何转换功能FROM_UNIXTIME我认为杀死索引。因此,它是更好的使用datedatetime,因为你可以利用索引,因为您可以通过使用=BETWEEN
+0

你有很棒的观点。不过,我有一个问题要问你。 DATETIME是时区独立正确的?如果我将UTC日期时间存储在DATETIME字段中,我可以直接在一行上运行DAY(),并获取行的UTC时间而不是本地时区的那一天? –

+0

由于您提到您存储的是UTC日期时间,因此从该日返回的值是来自数据库上的UTC日期时间保存。 –

+0

谢谢!感谢帮助。 :) –

存储它作为一个integer,然后使用MySQL的FROM_UNIXTIME()功能如下:

SELECT 
    `field_list` 
FROM 
    `table_name` 
WHERE 
    FROM_UNIXTIME(`the_date`, '%d') = 4; 
+0

我不能很容易地做时间戳FROM_UNIXTIME直接搜索的值,然后将其存储在DATETIME和使用DAY()做同样的事情?这种方法的优点是什么?我更喜欢用一串数字浏览数据库时的日期。 谢谢! –

+0

你可以,但是这给你在查询方面最干净的结果。你没有提到在问题中偏好数字串的日期 - 为什么产生一个时间戳,如果它对你没用? – BenM

+0

那么为了后面的效用和数据库的整体清洁度我更喜欢可读的日期。我还必须考虑在每个查询的每一行上运行FROM_UNIXTIME()时需要花费的时间,而不是将其插入数据库时​​需要一次。虽然考虑到我必须在每一行,每个查询上都运行DAY(),但这一点可能没什么意义。我无法说大型查询哪个更快或更合理。 我的主要问题是时区问题,但我相信DATETIME over TIMESTAMP可能会解决这个问题。 –