MySQL 日期还是 PHP 时间?

2022-08-30 20:44:50

我通常在MySQL数据库中使用PHP函数将日期存储为整数,而不是使用MySQL的日期格式,因为当我将其拉出时更容易操作,但是这有什么缺点吗?time()


答案 1

范围:

总有一个明显的缺点:您可以存储的范围是有限的från 1970到2038。如果您需要存储超出此范围的日期,则通常需要使用其他格式。我发现最常见的情况是出生日期。

可读性:

我认为人们选择使用内置日期类型之一的最重要原因是数据更容易解释。您可以执行简单的选择,并了解值,而无需进一步格式化响应。

指标:

使用日期类型的一个很好的技术原因是,在某些情况下,它允许索引查询,而 unix 时间戳则不允许。请考虑以下查询:

SELECT * FROM tbl WHERE year(mydate_field) = 2009;

如果mydate_field是本机日期类型,并且字段上有索引,则无论调用函数如何,此查询实际上仍将使用索引。这几乎是mysql唯一一次可以优化此类字段的函数调用。时间戳字段上的相应查询将无法使用索引:

SELECT * FROM tbl WHERE year(from_unixtime(mytimestamp_field)) = 2009;

不过,如果你稍微考虑一下,有一种方法可以解决这个问题。此查询执行相同的操作,并且将能够使用索引优化:

SELECT * FROM tbl WHERE mytimestamp_field > unix_timestamp("2009-01-01") AND mytimestamp_field < unix_timestamp("2010-01-01");

计算:

通常,我将日期存储为unix时间,尽管有缺点。这并不是基于它的优点,而是因为我习惯了它。我发现这简化了一些计算,但使其他计算复杂化。例如,很难将一个月添加到 unix 时间戳中,因为每月的秒数各不相同。使用 mysql DATE_ADD() 函数非常容易。但是,我认为在大多数情况下,它实际上简化了计算。例如,您希望从过去两天中选择帖子是很常见的。如果该字段包含unix时间戳,则只需执行以下操作即可轻松完成:

SELECT * FROM tbl WHERE mytimestamp_field > time() - 2*24*3600;

这可能是一个品味问题,但我个人发现这比必须修改函数(如DATE_SUB())的语法更快,更容易。

时区:

Unix 时间戳无法存储时区数据。我住在瑞典,那里有一个单一的时区,所以这对我来说不是问题。但是,如果您生活在一个跨越多个时区的国家/地区,这可能是一个主要的痛苦。


答案 2

一个缺点是,您将无法使用 SQL 函数操作和查询这些日期。


推荐