我正在使用Oracle Express数据库,我想知道如何更改日期格式 -
从dd-mm-yyyy到dd-mm-yyyy hh-mm。另外,我听说过有关alter session
的内容,但我不知道如何在Perl中使用它。
这是我到目前为止所做的:
my $sth = $dbh->prepare("INSERT INTO Perl
(A_FIELD,B_FIELD,C_FIELD,TIME_STAME)
VALUES
(?,?,?,TO_DATE(?,'DD/MM/YYYY HH24:MI'))");
答案 0 :(得分:3)
Oracle中的日期字段未格式化显示 - 它是您在输入/输出上转换为/的internal format。在Oracle date数据类型列中存储日期时,通过使用format model字符串描述TO_DATE函数的日期时间,将字符串转换为内部格式。 Oracle将字符串解释为其内部格式。当你需要显示日期时,你会反过来 - 你告诉oracle如何通过再次给出格式模型来显示日期,这次是TO_CHAR函数。
为了说明您的示例,您可以将dd-mm-yyyy转换为dd-mm-yyyy hh-mm而不存储值(我假设您打算显示小时 - 分钟。分钟的格式模型是'MI ',因为'MM'是月份):
SQL> SELECT TO_CHAR(TO_DATE('01-01-2020','DD-MM-YYYY'),'DD-MM-YYYY HH-MI') mydate
FROM DUAL;
MYDATE
----------------
01-01-2020 12-00
请注意,在您的示例中,日期的时间部分不会在输入时提供,因此默认为午夜。要在日期列中存储时间值,您必须在输入中提供时间值:
SQL> SELECT TO_CHAR(TO_DATE('01/01/2020 10:13','DD/MM/YYYY HH:MI'),'DD-MM-YYYY HH-MI') mydate
FROM DUAL;
MYDATE
----------------
01-01-2020 10-13
SQL>
根据您要执行的操作,可以通过对伪列SYSDATE的引用来获取Oracle中的系统日期:
SQL> SELECT TO_CHAR(sysdate,'MM/DD/YYYY HH:MI:SS AM') dt1,
2 TO_CHAR(sysdate,'DD-MON-YYYY HH24:MI:SS') dt2
3 FROM dual;
DT1 DT2
---------------------- -----------------------------
07/01/2011 03:44:30 PM 01-JUL-2011 15:44:30
SQL>
所以你的问题的回旋答案是它完全取决于输入日期字符串的格式。通过格式模型和TO_DATE函数将其转换为Oracle的日期类型,然后将日期项转换为显示格式您通过TO_CHAR和格式模型选择的。至于您在问题中提到的“ALTER SESSION”命令,您可以通过在ALTER SESSION命令中指定NLS_DATE_FORMAT参数来指定日期转换的默认格式模型:
SQL> SELECT sysdate FROM dual;
SYSDATE
---------
02-JUL-11
SQL> ALTER SESSION SET nls_date_format='dd-mon-yyyy hh24:mi:ss';
Session altered.
SQL> SELECT sysdate FROM dual;
SYSDATE
--------------------
02-jul-2011 10:39:24
答案 1 :(得分:0)
如果传入的日期字符串是mm-yyyy格式,那么您可以使用下面的语句(TO_DATE(?,'MM-YYYY')
)将字符串转换为日期:
$sth = $dbh->prepare("INSERT INTO Perl (A_FIELD,B_FIELD,C_FIELD,TIME_STAME) VALUES (?,?,?,TO_DATE(?,'MM-YYYY'))");