【问题标题】:compare date in sql command在sql命令中比较日期
【发布时间】:2015-08-11 17:51:45
【问题描述】:

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

【问题讨论】:

  • 您使用的是什么数据库,该列的数据类型是什么?根本不应该有任何格式。格式只是处理文本时的一个问题,日期应该存储为二进制日期,而不是文本。如果你真的有一个格式,那么你几乎肯定做错了。
  • 预言机和时间戳
  • 您喜欢比较个别的日、月、年,还是比较日期+月+年?
  • 是的.. 我只想比较 dd/mm/yyyy @Jacky

标签: sql asp.net oracle date


【解决方案1】:

我假设您在数据库中的记录和用户输入都是时间戳。 您可以使用 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))

【讨论】:

    【解决方案2】:

    我的数据库将日期保存为此格式 5/29/2015 12:07:58.000000 AM

    没有。 日期/时间戳没有任何格式。 Oracle 不会以您看到的格式存储日期/时间戳。您看到的格式仅用于显示目的。 日期在内部以 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

    但是,在日期 column 上应用 TRUNC 会抑制该列上的任何常规 index。从性能的角度来看,最好使用日期范围条件

    例如,

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-12-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-28
      • 2015-04-15
      • 2010-10-10
      相关资源
      最近更新 更多