无法获取记录 SQL [重复]

Posted

技术标签:

【中文标题】无法获取记录 SQL [重复]【英文标题】:Unable to fetch records SQL [duplicate] 【发布时间】:2020-02-21 04:13:13 【问题描述】:

数据库 - 表格

 PROD.LOG 
Game_ID    Generated_DT Timestamp

 1          Jan-01-2005 03.31.55.263000000 PM
 2          Aug-19-2003 06.38.04.302000000 PM
 3          Nov-04-2001 02.18.26.102000000 PM
 4          Sep-26-2007 04.58.03.270000000 PM
 5          Sep-26-2007 06.35.55.589000000 PM
 6          Sep-26-2007 07.35.58.800000000 PM
 7          Sep-19-2007 12.43.01.142000000 PM
 8          Sep-19-2007 02.49.55.179000000 PM
 9          Sep-19-2007 04.38.09.565000000 PM
10          Jan-11-2005 05.18.06.669000000 PM
11          MAY-19-2003 03.38.55.432000000 PM
12          Sep-22-2007 01.38.43.872000000 PM
13          Sep-22-2007 09.38.55.982000000 PM

我运行了以下查询

SELECT *
FROM PROD.LOG JOIN PROD.STATUS ON (PROD.STATUS_ID = REF_STATUS.STATUS_ID)  

AND PROD.LOG.GENERETED_DT >= to_date('2007-09-19', 'yyyy-MM-dd') AND     
    PROD.LOG.GENERETED_DT <= to_date('2007-09-26', 'yyyy-MM-dd');

搜索从 2007 年 9 月 19 日到 2007 年 9 月 26 日的记录,即 8 条记录。

这导致显示 2007 年 9 月 19 日 znd 2007 年 9 月 22 日的唯一记录,即只有 5 条记录

Actual Output
Game ID    Generated_DT
7           Sep-19-2007 12.43.01.142000000 PM
8           Sep-19-2007 02.49.55.179000000 PM
9           Sep-19-2007 04.38.09.565000000 PM
12          Sep-22-2007 01.38.43.872000000 PM
13          Sep-22-2007 09.38.55.982000000 PM

如何生成搜索查询,以便我可以获得所有 8 条记录 - 即这些日期的记录

预期输出

Game ID    Generated_DT
 4          Sep-26-2007 04.58.03.270000000 PM
 5          Sep-26-2007 06.35.55.589000000 PM
 6          Sep-26-2007 07.35.58.800000000 PM
 7          Sep-19-2007 12.43.01.142000000 PM
 8          Sep-19-2007 02.49.55.179000000 PM
 9          Sep-19-2007 04.38.09.565000000 PM
12          Sep-22-2007 01.38.43.872000000 PM
13          Sep-22-2007 09.38.55.982000000 PM

试过

SELECT *
FROM PROD.LOG JOIN PROD.STATUS ON (PROD.STATUS_ID = REF_STATUS.STATUS_ID)  

AND PROD.LOG.GENERETED_DT >= to_date('2007-09-19', 'yyyy-MM-dd') AND     
    PROD.LOG.GENERETED_DT = to_date('2007-09-26', 'yyyy-MM-dd');

复活无记录

【问题讨论】:

GENERATED_DT 列的类型是什么? 【参考方案1】:

您的问题是您的数据中存在时间组件。有几种不同的方法可以解决这个问题,但它们都具有相同的目的:您需要将时间部分考虑在内。

您的代码调用 to_date(),格式参数中没有任何时间组件。默认为午夜。所以你的 WHERE 子句真正在做的是在 2007 年 9 月 26 日午夜切断。对于您的第一个语法错误,您是在说“告诉我在 2007 年 9 月 26 日午夜发生的所有内容”。

要解决此问题,您需要在 to_date() 调用中添加时间组件。或者您可以在 generated_dt 上调用 trunc() 函数。您选择哪种方法取决于您的表大小、性能预期以及是否要利用列上的索引。

方法一:

AND PROD.LOG.GENERETED_DT >= to_date('2007-09-19', 'yyyy-MM-dd') AND     
    PROD.LOG.GENERETED_DT < to_date('2007-09-27', 'yyyy-MM-dd')

方法 2(这将忽略genereted_dt 列上的索引,除非您构建基于函数的索引):

AND trunc(PROD.LOG.GENERETED_DT) >= to_date('2007-09-19', 'yyyy-MM-dd') AND     
    trunc(PROD.LOG.GENERETED_DT) <= to_date('2007-09-26', 'yyyy-MM-dd')

方法三:

AND PROD.LOG.GENERETED_DT >= to_date('2007-09-19', 'yyyy-MM-dd') AND     
    PROD.LOG.GENERETED_DT <= to_date('2007-09-26 23:59:59', 'yyyy-MM-dd HH24:MI:SS')

方法4(使用BETWEEN语法,功能同上):

AND trunc(PROD.LOG.GENERETED_DT) BETWEEN to_date('2007-09-19', 'yyyy-MM-dd') AND to_date('2007-09-26', 'yyyy-MM-dd')

【讨论】:

以上是关于无法获取记录 SQL [重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何获取在 SQL 中具有重复列组合的记录? [复制]

SQL获取最后一个日期时间记录[重复]

如果所需的列值重复 [重复],则 SQL 查询以获取顶部记录

SQL游标获取重复记录

sql 获取重复记录

sql仅获取这些日期之间的记录[重复]