【问题标题】:select a date with where clause选择带有 where 子句的日期
【发布时间】:2017-06-17 19:35:05
【问题描述】:
select Artikel from liste_vorbestellungen 
where Termin_fuer_Abholung = 2017;

我有一张表,我必须选择日期为 2017 年的所有文章,这已经有效,我现在的问题是,我在表中的日期是用日、月和年给出的,我如何选择文章2017 年是不是只给了年份?

【问题讨论】:

  • 这可以通过使用返回日期年份的函数来完成,但该函数可能会根据您使用的RDBMS而改变,因此请添加一个标签来指定它。

标签: sql


【解决方案1】:

一般来说,使用显式比较日期而不是函数比较好。为什么?因为这允许优化器使用索引。因此,虽然 Mureinik 的回答是正确的,但以下可以(在某些情况下)具有更好的性能:

select l.Artikel
from liste_vorbestellungen l
where l.Termin_fuer_Abholung >= '2017-01-01' AND
      l.Termin_fuer_Abholung < '2018-01-01' ;

特别是,这可以利用liste_vorbestellungen(Termin_fuer_Abholung, Artikel) 上的索引。

【讨论】:

    【解决方案2】:

    您没有使用任何 标记您的问题,但大多数都支持year 函数从日期中提取年份:

    SELECT Artikel
    FROM   liste_vorbestellungen 
    WHERE  YEAR(Termin_fuer_Abholung) = 2017;
    -- Here^
    

    编辑:
    正如 @a_horse_with_no_name 在 cmets 中指出的那样,标准的 ANSI-SQL 方法是使用 extract 函数:

    SELECT Artikel
    FROM   liste_vorbestellungen 
    WHERE  EXTRACT(YEAR FROM Termin_fuer_Abholung) = 2017;
    -- Here^
    

    【讨论】:

    • 在标准 SQL 中,这将是 extract(year from termin_fuer_abholung)(Oracle、Postgres 和 Firebird 不支持 year() 仅标准的 extract() 函数)
    • @a_horse_with_no_name 今天学到了一些东西,谢谢!编辑到我的答案中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-07
    • 2019-09-12
    • 2021-11-30
    • 2011-07-05
    • 1970-01-01
    • 2018-10-06
    • 1970-01-01
    相关资源
    最近更新 更多