【问题标题】:How to Insert table column values: month & day from column datetype如何插入表格列值:来自列日期类型的月份和日期
【发布时间】:2012-06-16 21:50:52
【问题描述】:

我正在使用 Oracle 11g 架构

我想从一个日期中选择月份和日期,将它连接起来并放入一个列中。

我在这里的语法是有道理的,但它会抛出一个错误..

INSERT INTO OB_SELECT_LST12_SPG WED 
  VALUES (((TO_CHAR(TO_DATE('RET_DATE', MM))||( TO_CHAR(TO_DATE('RET_DATE', DD)));

“SQL 错误:ORA-00907:缺少右括号”

非常感谢任何帮助。 谢谢。

【问题讨论】:

  • 我假设RET_DATE 应该是日期列,而不是字符串,对吗? RET_DATEOB_SELECT_LST12_SPG 中的列吗?或者它是不同表中的一列?
  • 我不知道你的整个插入是否写得很好,但错误很明显,你缺少几个括号。例如,它应该是这样的:VALUES ( TO_CHAR(TO_DATE('RET_DATE', MM)) || TO_CHAR(TO_DATE('RET_DATE', DD)));。这是第一步
  • 试试这个 - ((To_Char(To_Date('RET_DATE', MM)))||( To_Char(To_Date('RET_DATE', DD))))
  • @JustinCave 是的,RET 是 OB_SELECT_LST12_SPG 表中的一列。
  • @rs。抱歉.. 仍然出现错误..“SQL 错误:ORA-00947:没有足够的值”

标签: sql oracle11g concatenation oracle-sqldeveloper datepart


【解决方案1】:

先说几点……

  1. 您的表名中包含空格
  2. 您的列数不足错误是由于您的表格中有多个列而导致的
  3. 你真的不应该这样做
  4. 如果ret_date 是一列,请不要将其括在引号中 ('),因为您将无法将字符串 'ret_date' 转换为日期。

但是,假设ret_date 是一个看起来像13-06-2012 的字符串

insert into ob_select_lst12_spg_wed (my_column)
values(to_char(to_date(:ret_date,'dd-mm-yyyy'),'mmdd'));

如果ret_date 是日期数据类型,那么您可以删除内部转换。

insert into ob_select_lst12_spg_wed (my_column)
values(to_char(:ret_date,'mmdd'));

to_charto_date 都使用datetime format models,它们有很多选项。


请不要这样做。 始终将日期存储为日期


在您的 cmets 中,ret_date 是一个日期,而列 wed 是一个字符。您收到错误绑定变量未声明,因为您尚未指定变量。我将假设 ret_date 在另一个表中,因为它是一个日期,在这种情况下会丢失 values 关键字并直接从该表中插入:

insert into ob_select_lst12_spg (wed)
select to_char(ret_date,'mmdd')
  from the_other_table

这不应该是必需的,您可以随时将日期转换为数据库中exit 所需的任何日期。如果您不将其作为日期存储在数据库中,那么很容易出现错误和不正确的值。我个人会将列 wed 更改为日期,在这种情况下您的查询变得非常简单:

insert into ob_select_list12_spg (wed)
select ret_date
  from the_other_table

然后,在从数据库中进行选择时,您可以根据需要使用正确的 datetime format model

【讨论】:

  • 我要添加的表列名为 WED。所以,我试过这样做.. 插入 ob_select_lst12_spg (wed) values(to_char(:ret_date, 'mmdd'));我收到一条错误消息,告诉我未声明绑定变量“ret_date”。我还应该做些什么吗?所以,如果我没听错的话.. 我应该将该字段重新创建为日期字段而不是 varchar2 字段?我会尝试一下,看看是否有帮助..感谢您的解释..
  • @BEN 谢谢.. 我创建了一个新列,它是一个日期列。我只想要原始日期列中的月份和日期。另外,我正在其他地方阅读,发现 nls_date_format = dd-mon-rr。不知道如何处理。
【解决方案2】:

您缺少额外的括号。打开( 的数量为8,关闭) 的数量为5

INSERT INTO OB_SELECT_LST12_SPG(WED) 
VALUES ((TO_CHAR(TO_DATE(RET_DATE, MM)))||( TO_CHAR(TO_DATE(RET_DATE, DD))));

更新 确保不需要其他列(即允许 NULL)

【讨论】:

  • 我不知道这是否与它有关,但 RET_DATE 字段已经是日期类型。我尝试了您的语句,它仍然抛出错误“SQL错误:ORA-00947:没有足够的价值”
【解决方案3】:

从日期列获取日期、月份的示例查询:

Select ((To_Char(to_date('01-FEB-73','dd-mon-yy'), 'MM'))
       ||( To_Char(to_date('01-JAN-73','dd-mon-yy'), 'dd')))
 from dual;

如果 RET_DATE 是日期数据类型,则使用

insert into table_name (columname) 
Select ((To_Char(RET_DATE, 'MM'))
           ||( To_Char(RET_DATE, 'dd')))
     from dual;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-09
    • 1970-01-01
    • 2018-12-29
    • 2015-06-09
    • 2022-11-17
    • 1970-01-01
    相关资源
    最近更新 更多