to_date 一年不返回 4 位,只有 2

Posted

技术标签:

【中文标题】to_date 一年不返回 4 位,只有 2【英文标题】:to_date not returning 4 digits for year, only 2 【发布时间】:2015-11-20 19:32:56 【问题描述】:

我正在尝试以 DD/MON/YYYY 格式输出日期,其中年份有 4 位数字。我的变量返回 4 位数的年份(例如 2000,而不是 00),但是当我通过 to_date 函数运行它时,它似乎将其分配为 2 位数。

我试图显示输出以隔离我为这一年提供的输入,它输出的年份变量是 4 位数字,所以我不确定出了什么问题。

这是我的代码:

myDate1 := to_date(myDate1_DD || '/' || myDate1_MON || '/' || myDate1_YY , 'DD/MON/YYYY'); 
myDate2 := to_date(myDate2_DD || '/' || myDate2_MON || '/' || myDate2_YY , 'DD/MON/YYYY');

IF  myDate1 > myDate2  
THEN
    -- return '01/JAN/01 > 01/JAN/99. The year for date1 is 2001'
    return myDate1 || ' > ' || myDate2 || '. The year for date1 is  ' || myDate1_YY;
ELSE
    -- return '01/JAN/03 > 01/JAN/02. The year for date2 is 2003'
    return myDate2 || ' > ' || myDate1 || '. The year for date2 is  ' || myDate2_YY;
END IF;

所以本质上,我想要的不是像 01/JAN/03 这样的输出,而是像 01/JAN/2003 这样的输出。

干杯

【问题讨论】:

你确定不应该是DD/MMM/YYYY @IlyaKogan 不,我相信 MON 是正确的。 techonthenet.com/oracle/functions/to_date.php 我根本不是 Oracle 专家 - 但根据名字 - to_date 不会将 string 转换回 date - 然后以您当前安装的默认日期格式呈现......如果您想要特定格式 - 您是否不必将 date to 一个 string (应用你想要的格式),然后输出那个 string ? 试试:return to_char(myDate1, 'dd/mm/yyyy') || ' > ' || to_char(myDate2, 'dd/mm/yyyy') .... 与您的问题没有直接关系,但您可以尝试:to_date(myDate1_DD || myDate1_MON || myDate1_YY , 'DDMONYYYY')。在没有必要时进行额外的连接似乎有点愚蠢。 【参考方案1】:

您看到的是 NLS_DATE_FORMAT 中指定的默认日期格式。

NLS_DATE_FORMAT 指定用于 TO_CHAR 和 TO_DATE 函数的默认日期格式。该参数的默认值由 NLS_TERRITORY 决定。

此参数的值可以是任何有效的日期格式掩码,并且该值必须用双引号引起来。例如:

NLS_DATE_FORMAT = "MM/DD/YYYY"

看看你的是什么:

SELECT value FROM v$nls_parameters WHERE parameter ='NLS_DATE_FORMAT';

查看 kordirko 关于获取所需实际日期格式的评论:

return to_char(myDate1, 'dd/MON/yyyy') || ' > ' || to_char(myDate2, 'dd/MON/yyyy');

使用 dbms_output 而不是返回的示例:

DECLARE
  myDate1_DD VARCHAR2(10) := '01';
  myDate1_MON  VARCHAR2(10) := 'JAN';
  myDate1_YY   VARCHAR2(10) := '2001';
  
  myDate2_DD VARCHAR2(10) := '01';
  myDate2_MON VARCHAR2(10) := 'JAN';
  myDate2_YY   VARCHAR2(10) := '2003';

  myDate1 DATE;
  myDate2 DATE;
BEGIN
myDate1 := to_date(myDate1_DD || '/' || myDate1_MON || '/' || myDate1_YY , 'DD/MON/YYYY'); 
myDate2 := to_date(myDate2_DD || '/' || myDate2_MON || '/' || myDate2_YY , 'DD/MON/YYYY');

IF  myDate1 > myDate2  
THEN
    -- return '01/JAN/01 > 01/JAN/99. The year for date1 is 2001'
    DBMS_OUTPUT.put_line( to_char(myDate1, 'dd/MON/YYYY') || ' > ' || to_char(myDate2, 'dd/MON/YYYY') || '. The year for date1 is  ' || myDate1_YY);
ELSE
    -- return '01/JAN/03 > 01/JAN/02. The year for date2 is 2003'
    DBMS_OUTPUT.put_line( to_char(myDate2, 'dd/MON/YYYY') || ' > ' || to_char(myDate1, 'dd/MON/YYYY') || '. The year for date2 is  ' || myDate2_YY);
END IF;
END;
/

使用这些输入,dbms_output 结果为:“01/JAN/2003 > 01/JAN/2001。date2 的年份是 2003”

【讨论】:

以上是关于to_date 一年不返回 4 位,只有 2的主要内容,如果未能解决你的问题,请参考以下文章

我的 NSManagedObject 有 2 To-Many 关系,但只有一个可以返回正确的类信息

为省钱,开源项目一年不更新就要删除代码?GitLab 紧急回应!

适合长期玩的Steam生存游戏推荐,这些大作能玩一年不腻

二维数组元素个数的算法

To_date 在 Year 通配符前返回 2 个零

两个小案例