我通常time()在MySQL数据库中使用PHP的函数将日期存储为整数而不是使用MySQL的日期格式,因为当我将其拉回时更容易操作,但这有什么缺点吗?
Emi*_*l H 24
范围:
总有一个明显的缺点:您可以存储的范围在1970年到2038年之间是有限的.如果您需要存储此范围之外的日期,您通常需要使用其他格式.我发现这种情况最常见的情况是生日.
可读性:
我认为人们选择使用其中一种内置日期类型的最重要原因是数据更易于解释.您可以进行简单的选择,并且无需进一步格式化响应即可理解值.
索引:
使用日期类型的一个很好的技术原因是它允许在某些情况下索引查询unix时间戳不会.请考虑以下查询:
SELECT * FROM tbl WHERE year(mydate_field) = 2009;
Run Code Online (Sandbox Code Playgroud)
如果mydate_field属于本机日期类型,并且该字段上有索引,则该查询实际上将使用索引,尽管函数调用.这几乎是mysql在这样的字段上优化函数调用的唯一时间.时间戳字段上的相应查询将无法使用索引:
SELECT * FROM tbl WHERE year(from_unixtime(mytimestamp_field)) = 2009;
Run Code Online (Sandbox Code Playgroud)
如果你考虑一下,有一种解决方法.该查询做同样的事情,并且将能够使用索引优化:
SELECT * FROM tbl WHERE mytimestamp_field > unix_timestamp("2009-01-01") AND mytimestamp_field < unix_timestamp("2010-01-01");
Run Code Online (Sandbox Code Playgroud)
计算:
一般来说,我将日期存储为unix时间,尽管存在缺点.这并不是基于它的优点,而是因为我已经习惯了它.我发现这简化了一些计算,但使其他计算复杂化.例如,由于每月的秒数不同,因此很难在unix时间戳中添加一个月.使用mysql DATE_ADD()函数非常容易.但是,我认为在大多数情况下,它实际上简化了计算.例如,您想要从最近两天选择帖子是很常见的.如果该字段包含unix时间戳,则只需执行以下操作即可轻松完成:
SELECT * FROM tbl WHERE mytimestamp_field > time() - 2*24*3600;
Run Code Online (Sandbox Code Playgroud)
这可能是一个品味问题,但我个人认为这比必须重新定义DATE_SUB()等函数的语法更快更容易.
时区:
Unix时间戳无法存储时区数据.我住在瑞典,有一个时区,所以这对我来说不是一个问题.但是,如果你生活在一个跨越多个时区的国家,那将是一个巨大的痛苦.