我的数据库将日期保存为此格式5/29/2015 12:07:58.000000 AM
。我从用户那里获得了5/29/2015 12:07:58
格式的日期输入。我可以只比较sql命令中的日/月/年而不是整行吗?我的数据库是oracle,格式为TIMESTAMP。
有谁知道怎么做?
答案 0 :(得分:2)
我的数据库以此格式保存日期5/29/2015 12:07:58.000000 AM
没有。 日期/时间戳没有任何格式。 Oracle不会以您看到的格式存储日期/时间戳。您看到的格式仅适用于显示目的。 Date内部存储在7个字节中,这是Oracle的专有格式。
我可以只比较sql命令中的日/月/年而不是整行吗?
当然可以。您可以使用 TRUNC 截断时间部分,只留下日期部分,数据类型保留为日期。
例如,
SQL> SELECT TRUNC(SYSTIMESTAMP) my_tmstmp FROM DUAL;
MY_TMSTMP
----------
2015-05-29
我从用户那里获得了5/29/2015 12:07:58格式的日期输入。
因此,您将该格式的用户输入视为字符串。您需要先使用 TO_DATE 将转换为DATE,然后进行比较。
例如,
WHERE TRUNC(dt_column) < TO_DATE('05/29/2015 12:07:58', 'MM/DD/YYYY HH24:MI:SS')
正如我已经说过的,如果你想忽略时间部分,那么应用 TRUNC 。
但是,在日期列上应用 TRUNC 会抑制该列上的任何常规索引。从性能的角度来看,最好使用日期范围条件。
例如,
WHERE dt_column
BETWEEN
TO_DATE('05/29/2015 12:07:58', 'MM/DD/YYYY HH24:MI:SS')
AND
TO_DATE('05/29/2015 12:07:58', 'MM/DD/YYYY HH24:MI:SS') +1
答案 1 :(得分:0)
我假设您在数据库和用户输入中的记录都是时间戳。 您可以使用TRUNC函数来获取该值的日期,并使用它来比较
declare
v_tsdate DATE;
v_txdate DATE;
begin
v_tsdate := TRUNC( CAST('5/29/2015 12:07:58.000000 AM' as DATE) );
v_txdate := TRUNC( CAST('5/29/2015 12:07:58' as DATE) );
--do the comparision and conditions you need with v_tsdate and v_txdate
end;
我转换为DATE格式的原因,因为TRUNCT(Timestamp)
理论上是TRUNC(CAST(Timestamp AS DATE))