【问题标题】:Problem with date matching between a variable and a date column Oracle SQL变量和日期列Oracle SQL之间的日期匹配问题
【发布时间】:2020-09-21 19:39:17
【问题描述】:

问题是这个查询工作正常:

CREATE TABLE PROCESGEN_TEST
(PROCESENDTIME TIMESTAMP);

INSERT INTO PROCESGEN_TEST
(SELECT DISTINCT PROCESENDTIME FROM  dwh_procesgeneriek@xob10
WHERE PROCESENDTIME IS NOT NULL
AND PROCESENDTIME > '10-09-2020 01:00:00');

Def TIME2 = (SELECT MAX_EXEC_TIME FROM EXEC_TIME);
SELECT PROCESENDTIME  
FROM PROCESGEN_TEST
WHERE PROCESENDTIME < &TIME2
AND PROCESEINDTIJD IS NOT NULL

在上述情况下,我们首先将数据放入我们使用的数据库管理系统中创建的表中(名为 xor01 而不是 xob10)。在下面的查询中,我们直接从 xob10 中提取数据。当我们想选择一个日期(大于或小于……)并且我们不知道为什么时,这不起作用。

CREATE TABLE EXEC_TIME
(MAX_EXEC_TIME DATE);

INSERT INTO EXEC_TIME
(
  SELECT TO_DATE(
           TO_CHAR(
             MAX(EXEC_DATE),
             'DD-MM-YYYY HH24:MI:SS'
           ),
           'DD-MM-YYYY HH24:MI:SS'
         ) - 1.1666
  from   L3DD_MIN_ACTIVITIES_BRD_BAK_Will
);

Def TIME3 = (SELECT MAX_EXEC_TIME FROM EXEC_TIME);

SELECT PROCESENDTIME
FROM   dwh_procesgeneriek@xob10 
WHERE  PROCESENDTIME IS NOT NULL
AND    TO_DATE(PROCESENDTIME,'DD-MM-YY HH24:MI:SS')
         > TO_DATE(&TIME3, 'DD-MM-YY HH24:MI:SS');

问题是查询在最后一个查询中没有找到单个日期并继续执行。如果我们将TO_DATE(&amp;TIME3, 'DD-MM-YY HH24:MI:SS') 替换为某个日期,例如'10-08-2020 20:00:00',则查询将找到正确的日期。我们尝试了各种方法,比如使用TIMESTAMP 格式和TO_TIMESTAMP。没有任何效果。这看起来是一个相当简单的问题。

有谁知道是什么导致了查询在第二个查询中找不到任何日期的问题?

【问题讨论】:

  • 你用什么工具来做这个?是sqlplus吗?
  • 你为什么要在已经日期的值上使用to_date()? (也不要使用 YY;使用 YYYY 或者如果你真的必须处理 2 位数的年份,你通常应该使用 RR)。您的插入看起来也不正确。
  • 这是你的完整剧本吗?将&amp;TIME3 替换为(SELECT MAX_EXEC_TIME FROM EXEC_TIME) 会发生什么?假设这只是一个 SQL Plus/Developer 替换变量,我认为这就是您的工具正在做的事情。
  • 我正在使用 Benthic Golden 7 软件。我尝试了这些建议,但没有结果。问题的根源在于数据来自另一个 Oracle(我认为)数据库。 Golden 最近升级到版本 7。可能是 NLS 参数不匹配?

标签: sql oracle date datetime


【解决方案1】:

你不需要:

  • EXEC_TIME 表;
  • 将时间戳转换为字符串,然后再转换回日期;
  • 使用变量;或
  • 过滤PROCESENDTIME IS NOT NULL(因为&gt; 过滤器仅适用于非NULL 值)。

那么你可以使用:

SELECT PROCESENDTIME
FROM   dwh_procesgeneriek@xob10 
WHERE  PROCESENDTIME
         > (
             SELECT MAX(EXEC_DATE) - INTERVAL '1 4' DAY TO HOUR
             FROM   L3DD_MIN_ACTIVITIES_BRD_BAK_Will
           );

如果您确实想要 EXEC_TIME 表,那么:

CREATE TABLE EXEC_TIME( MAX_EXEC_TIME DATE );

INSERT INTO EXEC_TIME
SELECT MAX(EXEC_DATE) - INTERVAL '1 4' DAY TO HOUR
FROM   L3DD_MIN_ACTIVITIES_BRD_BAK_Will;

SELECT PROCESENDTIME
FROM   dwh_procesgeneriek@xob10 
WHERE  PROCESENDTIME > ( SELECT MAX_EXEC_TIME FROM EXEC_TIME );

【讨论】:

  • 感谢您的反应。我尝试了第一个查询,但仍然没有结果。如果我将第一个查询中的 SELECT MAX(EXEC_DATE) - INTERVAL '1 4' DAY TO HOUR FROM L3DD_MIN_ACTIVITIES_BRD_BAK_Will ) 替换为 MAX(EXEC_DATE) 中的实际日期时间,则为 '19-09-2020 20:00:00'。然后它将给出正确的结果。 PROCESENDTIME 中的日期示例为“17-07-2015 15:42:06”。所以它们都有相同的格式。我在这里使用 Benthic Golden 7 软件工作。也许我在这里忽略了一些东西,但我不知道是什么。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-31
  • 1970-01-01
  • 2015-08-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多