转换Oracle存储过程DATE输入参数

时间:2018-03-23 13:55:15

标签: oracle plsql date-conversion

我是Oracle的新手,对存储过程的输入参数有疑问。基本上它是从外部系统调用的存储过程,传递格式为MM / DD / YYYY的日期。

Oracle似乎不喜欢MM / DD / YYYY格式,因为它给了我一个"而不是一个有效的月份"错误。 (我认为它想要一个DD-MMM-YYYY?)无论默认是什么。

有没有办法在日期进入过程中转换日期而不会出错?

如:

    create procedure test_proc
(
 v_input_date IN DATE := to_char(v_input_date, 'MM/DD/YYYY')
)

我知道上面的代码可能没有实际意义,但希望它能传达我想做的事情。用户可以调用类似

的过程
BEGIN
test_proc('01/01/2018')
END

2 个答案:

答案 0 :(得分:1)

您可以尝试ANSI类型date 'yyyy-mm-dd'格式,如下例所示:

SQL>create or replace procedure test_proc( v_input_date date ) is
  v_diff int;
begin
  v_diff := trunc(sysdate)-v_input_date;
  dbms_output.put_line(v_diff||' days difference...');
end;
/

SQL> set serveroutput on;
SQL> begin
  test_proc(date '2018-03-21');
end;
/
2 days difference...

答案 1 :(得分:1)

您的问题不在程序中,而是在调用程序的代码中。

// layout private void InitializeComponent(){ // Make contentview background red for debugging purposes this.BackgroundColor = Color.Red; this.VerticalOptions = LayoutOptions.Start; //The actual notification should be green MainStackLayout = new StackLayout{ Orientation = StackOrientation.Horizontal, VerticalOptions = LayoutOptions.Start, BackgroundColor = Color.Green }; var title = new Label{ Text = "Hello There" }; var msg = new Label{ Text = "Importaint stuff you should be aware of" }; var btn = new Button{ Text = "X", VerticalOptions = LayoutOptions.Start, HorizontalOptions = LayoutOptions.EndAndExpand, BorderColor = Color.Transparent, BackgroundColor = Color.Transparent, HeightRequest = 40, WidthRequest = 40, Margin = 3 }; btn.Clicked += OnDismissClicked; var textStack = new StackLayout(); textStack.Children.Add(title); textStack.Children.Add(msg); MainStackLayout.Children.Add(textStack); MainStackLayout.Children.Add(btn); Content = MainStackLayout; // Default visibility is hidden IsVisible = false; } 不是一个字符串的日期,但您的程序需要一个日期;但是,Oracle会尝试提供帮助,并会隐式尝试使用'01/01/2018'函数将字符串转换为日期。由于它没有指定的格式模型,因此它将使用日期的默认格式NLS_DATE_FORMAT session parameter,如果此格式掩码与字符串的格式不匹配,则会出现错误。

注意:会话参数是每用户会话,并且可以由每个用户更改,因此您不应该依赖它们对于每个用户是相同的,甚至对同一用户的会话之间也是如此!

您可以使用查询查看TO_DATE( string_value, format_model )会话参数的格式:

NLS_DATE_FORMAT

调用该过程的代码隐式转换为:

SELECT VALUE
FROM   NLS_SESSION_PARAMETERS
WHERE  PARAMETER = 'NLS_DATE_FORMAT';

要生成日期,您应该通过以下方式将字符串显式转换为日期: