比较sql命令

时间:2015-05-29 01:45:30

标签: sql asp.net oracle date

我的数据库将日期保存为此格式5/29/2015 12:07:58.000000 AM。我从用户那里获得了5/29/2015 12:07:58格式的日期输入。我可以只比较sql命令中的日/月/年而不是整行吗?我的数据库是oracle,格式为TIMESTAMP。 有谁知道怎么做?

2 个答案:

答案 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))