【问题标题】:dd-mm-yyyy to yyyy-mm-dd SQLdd-mm-yyyy 到 yyyy-mm-dd SQL
【发布时间】:2020-02-24 19:20:52
【问题描述】:

我正在学校做 SQL 作业。 DATE 对我来说有问题。 有一个查询。

INSERT INTO myTable (t_id, Birthdate) VALUES (1, TO_DATE('01-Jun-2005','dd-mm-yyyy'));
INSERT INTO myTable (t_id, Birthdate) VALUES (2, TO_DATE('04-Apr-2002','dd-mm-yyyy'));
INSERT INTO myTable (t_id, Birthdate) VALUES (3, TO_DATE('21-Mar-2004','dd-mm-yyyy'));
INSERT INTO myTable (t_id, Birthdate) VALUES (4, TO_DATE('05-Dec-2002','dd-mm-yyyy'));
INSERT INTO myTable (t_id, Birthdate) VALUES (5, TO_DATE('13-Sep-2003','dd-mm-yyyy'));

我想获取 t_id,其中 YEAR 是 2002。我尝试了以下代码,

SELECT t_id FROM myTable WHERE YEAR(Birthdate) = '2002';

但它给了我语法错误。我在互联网上搜索了它。它说 YEAR 仅适用于 'yyyy-mm-dd' 格式。但是,在我的作业问题上,格式为“dd-mm-yyyy”。 我该如何回答我的问题?请帮助我摆脱这个地狱。

【问题讨论】:

  • 如果您标记您的 RDMS 产品,我们不再猜测了。SQL 只是本网站上的标准语言规范。
  • 但是TO_DATE(..) 建议您使用 Oracle 数据库或 PostgreSQL 作为 RDMS?

标签: sql date select where-clause to-date


【解决方案1】:

year() 并非在所有 RDBMS 中都受支持(尤其是您似乎正在使用的 Oracle 或 Postgres,不支持它)。改用sql标准函数extract()

extract(year from Birthdate)

如果Birthdatedate-like 数据类型,则此方法有效。如果它是某种格式的字符串,则需要先将其转换为日期,在 Oracle 中使用 to_date(),例如:

extract(year from to_date(Birthdate, 'yyyy-mm-dd'))

其他 RDBMS 有不同的函数将字符串转换为日期。

最后请注意,在过滤时避免使用函数会更有效,因为这会破坏被过滤列上的索引。你通常想对整个日期进行比较,所以:

Birthdate >= to_date('2002-01-01', 'yyyy-mm-dd') and
Birthdate < to_date('2003-01-01', 'yyyy-mm-dd')

注意:'01-Jun-2005' 的格式描述符将是 'dd-mon-yyyy',而不是 'dd-mm-yyyy'

【讨论】:

    【解决方案2】:

    你可以使用:

    
    SELECT t_id FROM myTable WHERE DATEPART(YEAR, Birthdate) = '2002'
    
    

    【讨论】:

    • 有关此答案的更广泛解释,请参阅"6 Functions to Get the Day, Month and Year from a Date in SQL Server"。这解释了为什么 DATEPART 是一个选项。
    • 这与 topicstarter 甚至没有使用的 SQL Server (MSSQL) 完全相关,因为 TO_DATE 是一个无效的 MSSQL 函数,它表明 topicstarter 正在使用 Oracle DB 或 PostgreSQL。这里的 SQL 标签不代表 MSSQL,它只是与 SQL 标准规范有关
    • DATEPART 在这种情况下也不是一个选项。 @sophievda TO_DATE 建议 topicstarter 使用 Oracle DB(最适合 extract(..) 或 PostgreSQL(DATE_PART() 并且还应该支持 extract(..)).. 见我上面的评论..
    • 很好的解释,感谢@RaymondNijland 的反馈,使它更加清晰。我的意思是通过这个答案给出一个来源和更广泛的解释,因为缺少“为什么”,因为这是一个答案(作为编辑建议;而不是作为该主题的答案)。我应该更清楚地结束我的最后一句话:“这解释了为什么根据这个答案 DATEPART 是一个选项。”
    【解决方案3】:

    :)

    这对我有用:

    SELECT t_id FROM your_table WHERE DATE_FORMAT(Birthdate, '%Y') = 2002

    【讨论】:

    • 你的代码只显示了年份的最后两位数字,这是为什么呢?
    • 我更改顺序以查看您的代码运行情况select DATE_FORMAT(Birthdate, '%y'), t_id From myTable;
    • 这是因为您使用的是 %y 而不是 %Y。 %y 返回最后两位数,%Y 返回全年。
    猜你喜欢
    • 2014-04-30
    • 1970-01-01
    • 2023-03-27
    • 2016-01-02
    • 1970-01-01
    • 2016-06-21
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    相关资源
    最近更新 更多