我在列中有时间戳,例如 30/05/06 11:40:34.000000000 AM
。我需要从这个值中提取年份(即2006年)和月份(即05年)。下面是我的SQL。
SELECT EXTRACT(YEAR FROM TO_DATE('19/10/09 10:45:44.000000000 AM')) FROM DUAL;
在运行SQL之后,我收到错误APPROVED_PROPOSALS
。
所以,我试图提供如下格式,
SELECT EXTRACT(YEAR FROM TO_DATE('19/10/09 10:45:44.000000000 AM','HH12:MI:SS.FF')) FROM DUAL;
但是,仍然会出现一些错误。我很确定,我提供的格式不正确。
ORA-01821: date format not recognized
请帮助我,让年和月形成这样的价值观。
基兰。
答案 0 :(得分:2)
您需要使用TO_TIMESTAMP
代替TO_DATE
。
SELECT EXTRACT (
YEAR FROM TO_TIMESTAMP ('19/10/09 10:45:44.000000000 AM',
'DD/MM/YY HH12:MI:SS.FF9 AM'))
FROM DUAL;
这是假设一年又一个月。在格式部分,您还需要提供日期格式,而不仅仅是时间部分。
答案 1 :(得分:0)
我看到的问题是你没有指定&#dd / mm / yy'以您的日期格式。正如Nitish指出的那样,你有一个时间戳(更准确),而不是约会。
您应该使用正确的格式,如下所示:
SELECT EXTRACT(YEAR FROM TO_TIMESTAMP('19/10/09 10:45:44.00000 AM', 'dd/mm/yy HH12:MI:SSXFF PM')) FROM DUAL;
或者我们固定的决心:
select substr('19/10/09 10:45:44.00000 AM', 4,2) MONTH
, substr('19/10/09 10:45:44.00000 AM', 7,2) YEAR
from dual;
答案 2 :(得分:0)
如果您打算在查询中使用timestamp列,则表示您不会遇到问题(此示例基于Nitish的答案):
with t as
(
select to_timestamp('19/10/2009 10:45:44.000000000 am', 'dd/mm/yyyy hh:mi:ss.ff9 am') ts
from dual
)
select extract(year from ts) ts_year,
extract(month from ts) ts_month
from t;
此外,我建议您检查此列中是否存储了小数秒,因为在您的示例中它们不是。这通常意味着您在此列中插入sysdate,而不是systimestamp。如果不需要小数秒,则没有时间戳列 - 日期类型就足够了。
答案 3 :(得分:0)
谢谢你们。这是一个很大的帮助,欣赏它。我使用了以下查询,
获得年份:
选择EXTRACT(年份来自(TO_DATE)(TO_CHAR(TO_TIMESTAMP) ('15 / 10/09 11:07:28.999900 AM','DD / YY / MM HH:MI:SS.FF a.m。'),'DD / YY / MM HH24:MI:SS'), 'DD / YY / MM HH24:MI:SS')))DT 来自双重;
月
选择EXTRACT(MONTH FROM(TO_DATE(TO_CHAR)(TO_TIMESTAMP ('15 / 10/09 11:07:28.999900 AM','DD / YY / MM HH:MI:SS.FF a.m。'),'DD / YY / MM HH24:MI:SS'), 'DD / YY / MM HH24:MI:SS')))DT 来自双重;