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 关系,但只有一个可以返回正确的类信息