【问题标题】:Select all rows with specified month date选择具有指定月份日期的所有行
【发布时间】:2023-03-31 12:28:01
【问题描述】:

我有一个表格,记录了所有预订。现在开始日期和结束日期以下列格式存储在此表中:

开始日期:DD/MM/YYYY 例如20/01/2011 为 1 月 20 日

预订结束日期的格式相同。 现在我需要做的是提供一个基于月份的日历,例如没有特定日期的 nov、oct、jan。如果选择了任何一个,则查询数据库中该月内所有存储的日期并将它们显示在列表中。

我目前正在使用 java sopreparedStatemetn 和 Statement。知道如何做到这一点吗?我面临的最大挑战是将用户输入的日期与我现在拥有的格式进行匹配和选择。 附:我正在使用 Oracle SQL 谢谢,真的很感激。

【问题讨论】:

    标签: java sql oracle


    【解决方案1】:

    如果您的列类型是DATE,则没有格式。但是,如果它是 varchar2,您应该可以将其转换为日期:

    select to_date(start_date,'dd/mm/yyyy') from mytable;
    

    如果您想要 2011 年 10 月的所有日期,您可以使用:

    select * from mytable where trunc(start_date,'MM') = to_date('01/Oct/2011','dd/mm/yyyy');
    

    (假设 start_date 是 DATE 类型)。

    【讨论】:

    • 此解决方案将阻止优化器使用start_date 上的任何索引。
    • 可以很方便的给字段添加基于函数的索引,如:create index trunc_start_date on mytable(trunc(start_date,'MM'));
    【解决方案2】:

    我会在日期列上使用范围条件:

    select * from mytable where start_date >= to_date('01/Oct/2011','dd/mm/yyyy') and start_date < to_date('01/Nov/2011','dd/mm/yyyy')
    

    使用 trunc,oracle 规划器应该能够选择索引,但是在这里您指定非修改值的范围。

    我假设作为 John Doyle,您的表格中有 DATE 格式。如果您使用的是 VARCHAR2,则会遇到极端的性能问题,因为需要进行全表扫描。如果至少日期格式为yyyy/mm/dd,则可以使用索引。考虑更改数据库设计以避免性能问题。

    【讨论】:

      猜你喜欢
      • 2015-04-18
      • 2016-08-24
      • 2017-07-19
      • 1970-01-01
      • 1970-01-01
      • 2021-12-15
      • 2014-02-25
      • 1970-01-01
      • 2021-09-23
      相关资源
      最近更新 更多