【问题标题】:fetch records between 'current date ' and next 5 days(future date) in oracle在 oracle 中获取“当前日期”和接下来 5 天(未来日期)之间的记录
【发布时间】:2020-10-28 08:44:26
【问题描述】:
Select * from dual where between  to_date(date,'YYYY-MM-DD') = '2020-10-01'
                    and to_date(date,'YYYY-MM-DD') + 5

这是正确的查询方式吗?

1.日期格式为varchar2 2.当前日期和未来 5 天之间的必需数据 3.首先需要转换成日期格式。 4. 下一个5应该是当天+5

【问题讨论】:

  • 某物之间...
  • 不要将日期存储在 varchar2 列中,使用正确的日期数据类型!
  • 列名是'日期',
  • 嗨,Jarlh,列已经预先定义,我们需要转换它,但是当我使用(to_date 和 to_char)时,我收到错误:oracle full year must be between -4713 and +9999,而不是 0
  • 那么由于日期输入错误,您会遇到数据问题。如果您使用的是 Oracle 12.2+,那么您可以解决应该表示日期但不使用 on conversion error 子句docs.oracle.com/en/database/oracle/oracle-database/12.2/sqlrf/… 的字符串

标签: sql string oracle datetime where-clause


【解决方案1】:

你可能想写:

where to_date(mydate, 'yyyy-mm-dd') between trunc(sysdate) 
                                      and trunc(sysdate) + 5

理由:

  • date是保留字;我认为这不是您的专栏的实际名称,所以我使用了其他名称;如果这是真名,则需要用双引号将其括起来("date",或"DATE",否则,取决于它最初的定义方式)

  • mydate 是一个字符串,因此您需要将其转换为日期:为此,您可以使用to_date()

  • 然后将其与当前日期进行比较,不包括时间部分:trunc(sysdate),以及 5 天后的同一日期

但是请注意,这将更有效地表达如下:

where mydate between to_char(trunc(sysdate), 'yyyy-mm-dd') 
               and to_char(trunc(sysdate + 5), 'yyyy-mm-dd')

这避免了字符串列上的日期转换,而是转换了区间界限。在这里,字符串比较是可能的,因为您存储的字符串的格式允许它(例如它被存储为dd-mm-yyyy',这是不可能的)。

不过,我强烈建议您将日期存储为dates 而不是字符串。出于多种原因,例如数据完整性和效率,您应该始终使用正确的数据类型。

【讨论】:

  • DATE 不是 Oracle 中的保留字吗? en.wikipedia.org/wiki/SQL_reserved_words
  • @jarlh:是的。我怀疑这是 OP 专栏的实际名称,但我添加了一个要点来提及这一点。
  • 我收到错误 ORA-01841:(完整)年份必须介于 -4713 和 +9999 之间,而不是 0
  • @TulsiThakur:那么您的专栏中有无效的日期。如果您在答案中使用第二个建议,您将不会收到该错误(您可能会得到超出范围的日期......)。
  • "我收到错误 ORA-01841" 这是因为您的“日期”列输入错误并且其中包含无效数据。当您使用字符类型数据列来存储日期时,没有什么可以阻止一个日期是“2010-10-28”,下一个是“05-04-12”,而下一个是“这是你的标志”。您刚刚证明了为什么使用正确类型的数据列如此重要。如果是日期,这意味着该列需要输入为 DATE。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-01
  • 2013-12-11
  • 1970-01-01
相关资源
最近更新 更多