【问题标题】:Compare to_date(CurrentDate) with timestamp比较 to_date(CurrentDate) 和时间戳
【发布时间】:2016-02-25 08:26:41
【问题描述】:

我只想将我的当前日期与时间戳字段进行比较,只是日期而不是时间,但它不会与它进行比较,因为查询变成了这样。我怎样才能做到这一点,请帮忙

查询:

SELECT com.PHONE_NUMBER
FROM communication com
WHERE com.COMMUNICATION_DATE = TO_DATE('23-11-15', 'dd-MM-yy')

数据库表字段值:

02-NOV-15 18.56.00.000000000

功能:

    public static String getCurrentDate() throws ParseException
    {
        DateFormat dateFormat = new SimpleDateFormat("dd-MM-yy");
        Date date = new Date();

        return dateFormat.format(date);
    }

【问题讨论】:

  • 你试过to_timestamp函数吗?
  • 我只是想比较日期而不是时间
  • 它能帮到你吗? community.oracle.com/thread/2381171。您可以简单地使用 TRUNC。
  • @MuhammadMuazzam 使用 TRUNC 不会在日期列上使用任何索引。因此,正如我所展示的,更好地使用日期范围条件。

标签: java sql database oracle timestamp


【解决方案1】:

注意:实际上几乎不可能将实际日期与毫秒与存储的日期相匹配。

更新:

我只想比较日期而不是时间


然后,获取Calendar 的实例以获取今天的日期,将字段设置为零(小时、分钟等)并与仅提取日期的SimpleDateFormat 进行比较:

public static boolean isEqualDate(String toCompare) throws Exception {
    DateFormat df = new SimpleDateFormat("dd-MMM-yy");
    Date toCompareDate = df.parse(toCompare);
    Calendar calendar = Calendar.getInstance();
    calendar.set(Calendar.HOUR, 0);
    calendar.set(Calendar.MINUTE, 0);
    calendar.set(Calendar.SECOND, 0);
    calendar.set(Calendar.MILLISECOND, 0);
    return toCompareDate.equals(calendar.getTime());
}

执行示例:

public static void main(String[] args) throws Exception {
    String date = "23-NOV-15 18.56.00.000000000";
    System.out.println(isEqualDate(date));
}

输出:

true

【讨论】:

  • 等等.. 不是与日期算术有关的 SQL 问题吗?还是我错过了什么?
  • 等等,你还能看到一个将字符串转换为日期的java方法吗?或者您忽略了您不感兴趣的问题部分?
  • 我只是真诚地问你,它是否同时依赖于 SQL 和 Java?因为这会使我们的答案不完整。无意冒犯!
  • @LalitKumarB 您可以通过多种方式解决编程问题,在这里您可以使用本机 sql 找到解决方案或使用 Java 处理此结果,没有不完整的答案,只有 2 种方法可以做同样的事情......
  • 好的,谢谢。我很想知道,因为我对 Java 一无所知。
【解决方案2】:

WHERE com.COMMUNICATION_DATE = TO_DATE('23-11-15', 'dd-MM-yy')

等式运算符将无法获取具有时间部分的行。

您可以在日期列上使用 TRUNC,但是,这将禁止在日期列上使用任何 index

正确且有效的方法是使用日期范围条件,以便在日期列上使用任何常规索引。 p>

WHERE com.COMMUNICATION_DATE >= TO_DATE('23-11-15', 'dd-MM-yy')
AND   com.COMMUNICATION_DATE <  TO_DATE('23-11-15', 'dd-MM-yy') +1

此外,当您只处理没有任何时间部分的日期元素时,请使用 ANSI 日期文字,它使用固定格式 'YYYY-MM-DD',因此它是 NLS 独立 .

WHERE com.COMMUNICATION_DATE >= DATE '2015-11-23'
AND   com.COMMUNICATION_DATE <  DATE '2015-11-23' +1

一个简单的演示:

SQL> SELECT *
  2  FROM dual
  3  WHERE SYSTIMESTAMP >= DATE '2015-11-23'
  4  AND   SYSTIMESTAMP <  DATE '2015-11-23' +1;

D
-
X

【讨论】:

  • 可能会出现错误:SQL错误:ORA-01830:日期格式图片在转换整个输入字符串之前结束
  • @MuhammadMuazzam 为什么?不可能。我加了一个demo,看答案。
  • @MuhammadMuazzam:使用此答案中的 SQL,该错误不可能出现。
  • '2015-11-23' +1 包括“2015-11-24 00:00:00”。我们不知道这是否是 OP 想要的。最好使用TRUNC(com.COMMUNICATION_DATE) = DATE '2015-11-23'BETWEEN TO_DATE('23-11-15', 'dd-MM-RR') AND TO_DATE('23-11-15 23:59:59', 'dd-MM-RR hh24:mi:ss'):如果您只使用2 位数字,也可以使用RR 而不是YY - 或者更好地使用四位数字,即YYYY
  • @WernfriedDomscheit 是的,我不应该在这里使用 BETWEEN。我的意思是 >= 和 <.>
猜你喜欢
  • 2012-07-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-26
  • 2011-07-24
  • 1970-01-01
相关资源
最近更新 更多