无法获取记录 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 [重复]的主要内容,如果未能解决你的问题,请参考以下文章