我是oracle的初学者,需要有关以下查询的帮助:
select admin_id, to_date(date_created, 'DD-MM-YYYY'), name, mobile, email, (select status from status where status.status_id = admin.status_id) from admin;
这是我的桌子:
SQL> desc admin
Name Null? Type
----------------------------------------- -------- ----------------------------
ADMIN_ID NOT NULL NUMBER(5)
STATUS_ID NOT NULL NUMBER(5)
DATE_CREATED TIMESTAMP(6)
STATUS_DATE DATE
NAME VARCHAR2(45)
MOBILE VARCHAR2(20)
EMAIL VARCHAR2(110)
SQL> desc status
Name Null? Type
----------------------------------------- -------- ----------------------------
STATUS_ID NOT NULL NUMBER(5)
STATUS VARCHAR2(36)
主要问题是我想在admin.status_id的基础上获得status.status。可以将其用作字符to_char(date_created,'DD/MM/YYYY')
来固定日期
to_date(date_created, 'DD-MM-YYYY')
没有什么意义。
date_created
是一个timestamp
,具有6位小数位数,精度为亚秒to_date
取一个字符串。因此,Oracle必须首先使用会话的nls_timestamp_format
将时间戳转换为字符串。这是发送到to_date
的字符串- CCD_ 8然后尝试使用"0"将该字符串转换回CCD_;DD-MM-YYYY";格式掩码。除非
nls_timestamp_format
设置为这种情况,否则转换将失败,并可能引发您报告的错误
如果所有这些转换都有效,那么您最终会向Java应用程序发送一个时间设置为午夜的日期。不过,一般来说,只需将时间戳发送回Java应用程序,并让它处理如何将其转换为字符串以及需要显示时间戳的哪些组件,通常会更有意义。所以我的默认设置是只选择date_created
。
如果您确实希望Oracle执行数据类型转换并将date
的时间组件设置为午夜,则可以使用trunc
和cast
。这避免了隐式数据类型转换,并消除了对会话的nls_timestamp_format
的依赖性。
trunc( cast( date_created as date ) )
-
检查
admin_id
和status_id
列中的值。确保它们是正确的数据类型。 -
你能重新排列下面的查询并检查输出吗。尽可能使用联接而不是嵌套查询来提高数据库的性能:
select ad.admin_id, to_date(ad.date_created, 'DD-MM-YYYY'), ad.name, ad.mobile, ad.email,st.status from admin ad,status st where ad.admin_id=st.status_id;
-
这里有一个类似问题的链接:获取错误-ORA-01858:在需要数字的地方发现了一个非数字字符(堆栈溢出(