繁体   English   中英

在sql命令中比较日期

[英]compare date in sql command

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

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

否。 日期/时间戳没有任何格式 Oracle不会以您看到的格式存储日期/时间戳。 您看到的格式仅用于显示目的。 日期在内部以Oracle专有格式7字节存储

我可以只比较日/月/年,而不是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会抑制该列上的任何常规索引 从性能角度来看,最好使用Date范围条件

例如,

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM