首页 > 解决方案 > dd-mm-yyyy 到 yyyy-mm-dd SQL

问题描述

我正在学校做 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”格式。我该如何回答我的问题?请帮助我摆脱这个地狱。

标签: sqldateselectwhere-clauseto-date

解决方案


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

extract(year from Birthdate)

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

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'


推荐阅读