Perl和Oracle DB - 帮助

时间:2011-07-01 20:56:26

标签: sql perl oracle

我正在使用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'))");

2 个答案:

答案 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'))");