【问题标题】:Select a year from a sql value which has a date value of xxxx-xx-xx从日期值为 xxxx-xx-xx 的 sql 值中选择年份
【发布时间】:2012-03-02 16:17:25
【问题描述】:

在我的 SQL 表中,我在 bday 列中有生日存储(例如)1987-02-31

我想要一个 SELECT 查询,它只选择年份,而忽略月份和日期,例如:

SELECT FROM users WHERE bday=1987

这可能与以这种方式存储的日期有关吗?

【问题讨论】:

    标签: php mysql sql linux


    【解决方案1】:

    您可以简单地使用YEAR() MySQL function:

    WHERE YEAR(bday)=1987
    

    【讨论】:

    • 使用BETWEEN '1987-01-01' AND '1987-12-31' 范围会不会更好?我认为对于范围,可以使用索引,但对于函数,不能使用索引。我想。
    【解决方案2】:

    如果字段是 Date 数据类型,@soju 的答案是正确的,但是...

    您明确表示您的数据库将它们存储为1987-02-31

    对我来说,这表明您可能正在处理使用 varchar 或其他文本字段来存储日期的数据库。

    如果是这种情况,您可以使用SUBSTRING 函数。

    WHERE SUBSTRING(bday, 1,4) = '1987'
    

    【讨论】:

    • 好的,它存储为日期,所以使用 YEAR 函数是最有效的?
    • 这取决于几件事。我实际上认为范围会更有效(@Wiseguy 关于烧酒答案的注释)。我认为 Date 函数是最容易处理的,但如果你纯粹看性能,我认为 range(BETWEEN) 会更好。要确定,您可以尝试两者并计时。根据记录的数量,差异可能可以忽略不计。通常在性能和简单性/可读性之间进行权衡。走哪条路取决于你。
    【解决方案3】:
    SELECT FROM users WHERE bday LIKE '1987-%'
    

    【讨论】:

      【解决方案4】:

      对于 MySQL,如果您的 bday 是日期列(不是文本列),您可以像这样使用 year() 函数:

      select * from users where year(bday)=1987;
      

      【讨论】:

        猜你喜欢
        • 2017-10-18
        • 1970-01-01
        • 2022-10-01
        • 2019-04-06
        • 2014-05-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-11-29
        相关资源
        最近更新 更多