Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在MySQL数据库中最好地存储年、月和日?_Sql_Mysql - Fatal编程技术网

如何在MySQL数据库中最好地存储年、月和日?

如何在MySQL数据库中最好地存储年、月和日?,sql,mysql,Sql,Mysql,如何最好地将年、月和日存储在MySQL数据库中,以便按年、年、月、年、月、日组合轻松检索?除非涉及时间,否则请使用日期数据类型。您可以使用其中的函数来选择日期的各个部分。我推荐一个明显的方法:使用一个 它存储年-月-日,没有时间(小时-分钟-秒等)组件。存储为日期,并使用内置函数:日()、月()或年()返回所需的组合。日期有什么问题?只要您需要Y、Y-M或Y-M-D搜索,它们就应该是可索引的。例如,日期的问题是,如果您想要跨越几年的所有12月记录。假设您有一个表tbl,其中列d类型为DATE 1

如何最好地将年、月和日存储在MySQL数据库中,以便按年、年、月、年、月、日组合轻松检索?

除非涉及时间,否则请使用
日期
数据类型。您可以使用其中的函数来选择日期的各个部分。

我推荐一个明显的方法:使用一个


它存储年-月-日,没有时间(小时-分钟-秒等)组件。

存储为日期,并使用内置函数:日()、月()或年()返回所需的组合。

日期有什么问题?只要您需要Y、Y-M或Y-M-D搜索,它们就应该是可索引的。例如,日期的问题是,如果您想要跨越几年的所有12月记录。

假设您有一个表
tbl
,其中列
d
类型为
DATE

1997年的所有记录:

SELECT * FROM tbl WHERE YEAR(d) = 1997
SELECT * FROM tbl WHERE d BETWEEN '1997-01-01' AND '1997-12-31'
1997年3月的所有记录:

SELECT * FROM tbl WHERE YEAR(d) = 1997 AND MONTH(d) = 3
SELECT * FROM tbl WHERE d BETWEEN '1997-03-01' AND '1997-03-31'
1997年3月10日的所有记录:

SELECT * FROM tbl WHERE d = '1997-03-10'

这可能与档案管理员对常见日期数据类型的问题有关。通常,您希望能够仅编码年份,或仅编码年份和月份,这取决于可用的信息,但您希望能够仅在一种数据类型中编码此信息。这是一个在很多其他情况下都不适用的问题。(在过去回答这个问题时,我曾让技术人员认为这是数据问题:您的数据有问题!)


e、 例如,在一个作曲家目录中,你正在记录一个事实,即作曲家在手稿上注明了“1951年1月”的日期。您可以在MySQL日期字段中输入什么来表示这一点?"1951-01"? "1951-01-00"? 两者都不是真的有效。通常情况下,您在不同的字段中编码年、月和日,然后必须在应用程序级别实现语义。这是非常不理想的。

如果你在一个固定的日期范围内做分析,考虑使用一个日期维度(表的花哨名称),并使用一个外键进入日期维度。查看此链接:

如果使用这个日期维度,就可以考虑对任何类型的日期构造查询,这是多么容易。

SELECT * FROM my_table
JOIN DATE_DIM date on date.PK = my_table.date_FK
WHERE date.day = 30 AND
      date.month = 1 AND
      date.year = 2010


我是最远的MySQL专家,但我注意到MySQL文档建议在查询时显式地将字符串文本转换为日期(其中d介于CAST('1997-03-01'作为日期)和CAST('1997-03-31'))。否则,我假设日期列的值将转换为字符串,以允许进行通配符比较,从而无法在列上使用索引。Larry,我以前从未听说过这一点,但这很有意义。谢谢这是一个模糊和主观的问题,但请阅读本文:它将引导你走向正确的方向!
SELECT * FROM my_table
JOIN DATE_DIM date on date.PK = my_table.date_FK
WHERE date.day_of_week = 1 AND
      date.month = 1 AND
      date.year = 2010
SELECT *, date.day_of_week_name FROM my_table
JOIN DATE_DIM date on date.PK = my_table.date_FK
WHERE date.is_US_civil_holiday = 1