Oracle TRUNC 函数在 perl 中不起作用

Oracle TRUNC function doesn't work in perl

我尝试在 my_table 中插入创建的字段。创建的字段具有日期时间类型。在 my_table 中,字段 my_created 具有日期格式。所以我尝试 TRUNC 创建的字段。但是,我在插入截断值时遇到错误 ORA-01830: date format picture ends before converting entire input string。似乎时间还在,只是重置为00:00。我怎样才能得到没有时间的日期?它只发生在 perl 中。我只得到蟾蜍的约会。 非常简化的代码如下所示:

my $SQL="SELECT 
        TRUNC(CREATED),
    FROM 
        DBA_OBJECTS";
my $sth = $db->prepare($SQL);
$sth->execute();
my $date =  $sth->fetchrow();

$SQL = "INSERT INTO  MY_TABLE
                    (MY_CREATED) 
         VALUES (?)";
        
my $stmt = $dbh_master->prepare($SQL);
$stmt->execute($date);

编辑: 我找到了一个丑陋的解决方法,我是这样执行的:

$stmt->execute(substr($date, 0, 10));

不过也许有人有更好的解决方案。

How can I get only the date without time?

在Oracle中,DATE是一种二进制数据类型,由7个字节组成,分别代表:世纪、year-of-century、月、日、时、分、秒。它 ALWAYS 具有那些二进制组件,因此如果您想要 Oracle DATE 数据类型,那么您需要时间才能获得它。

Oracle DATE 数据类型是 并且早于 ANSI/ISO 标准(1986 年,其中 DATE 没有时间部分)并且 Oracle 有保持与其先前数据类型的向后兼容性,而不是采用 ANSI 标准。

如果您使用 TRUNC(date_value, format_model) function 那么它会将 DATE 的二进制组件设置为指定格式模型的最小值(0 表示小时、分钟和秒,1 表示天和月),但它会NOT 给你一个没有时间部分的数据类型。


It happens only in perl. I'm getting only date in toad.

不,您正在获取 Toad 中的整个 7 字节二进制值;但是,用户界面只选择向您显示日期组件。首选项中应该有一个设置可以在 Toad 中设置日期格式,这样您就可以看到整个 date-time 组件。

Oracle SQL/Plus 和 SQL 开发人员使用 NLS_DATE_FORMAT 会话参数,Toad 也可以使用它。


如果您想获取 DATE 的值,那么它将始终有一个时间分量(即使您使用 TRUNC 将该时间分量设置为零)。

如果你想获取日期,以便它以一种没有时间组件的方式格式化,那么你需要将它转换为另一种数据类型,并且可以使用 TO_CHAR 将其格式化为字符串:

SELECT TO_CHAR(CREATED, 'YYYY-MM-DD')
FROM   DBA_OBJECTS

但是您将返回一个(格式化的)字符串而不是 DATE 数据类型。