sql - 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”格式。我该如何回答我的问题?请帮助我摆脱这个地狱。
解决方案
year()
并非所有 RDBMS 都支持(尤其是您似乎正在使用的 Oracle 或 Postgres,不支持它)。改用 sql 标准函数extract()
:
extract(year from Birthdate)
如果Birthdate
是date
-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'
。