0

我正在使用一个我是一个卑微的苦工的数据库。我无法对数据库进行更改,我的建议被忽略了。我感兴趣的字段是一个 varchar,它以“MMDDYYHH24MISS”格式捕获时间,但正如我所说,将其作为文本存储在 varchar 字段中。

我的老板想要一份报告,我必须在此字段上使用 between 语句来过滤实际的 DATE 范围。好吧,问题来了,文本将 0000 小时存储为 2400 小时,这确实搞砸了 BETWEEN 子句。不过,我无法更改字段类型。

我已经想出了如何将 24 替换为 00 但如何让它在 SELECT 语句的 WHERE 部分中运行 BETWEEN ?每个人都说“只需将 VARCHAR 字段更改为 DATA 字段”。好吧,我不能——我是一个卑微的苦工。

我将如何运行此代码,然后在 SELECT 的 WHERE 部分的 BETWEEN 语句中运行另一个引用 FIX_DATETIME 的 SELECT 语句?

一位在数据沼泽中涉水的年轻女士,Copra Loom

IE。WHERE to_date(FIX_DATETIME, 'MMDDYYHH24MISS') 在 (sysdate-90) 和 sysdate 之间

这是我的代码:

SELECT MOPACTIVITY.MOPID,
    (CASE 
        WHEN SUBSTR(MOPACTIVITY.MOPID, 7, 2) = '24' THEN SUBSTR(MOPACTIVITY.MOPID, 1, 2)||SUBSTR(MOPACTIVITY.MOPID, 3, 2)||SUBSTR(MOPACTIVITY.MOPID, 5, 2)||'00'||SUBSTR(MOPACTIVITY.MOPID, 9, 2)||SUBSTR(MOPACTIVITY.MOPID, 11, 2)
        ELSE MOPACTIVITY.MOPID
    END ) FIX_DATETIME,
sysdate "SYSDATE"
FROM MOPUSER.MOPACTIVITY
4

2 回答 2

4

这会将 24 变成 00:

SUBSTR(FIX_DATETIME,1,6) 
   || REPLACE(SUBSTR(FIX_DATETIME,7,2),'24','00') 
   || SUBSTR(FIX_DATETIME,9,4)

那么您的 BETWEEN 测试是:

WHERE to_date (SUBSTR(FIX_DATETIME,1,6) 
                  || REPLACE(SUBSTR(FIX_DATETIME,7,2),'24','00') 
                  || SUBSTR(FIX_DATETIME,9,4),
              'MMDDYYHH24MISS') BETWEEN (sysdate-90) and sysdate
于 2013-06-11T13:02:00.920 回答
-1

我采用的解决方案是创建一个去除 24 并用 00 替换它们的字段。将表从 SQuirreL 中运行到 TEMP 表中,然后从我的临时表中运行中间值。这就是我得到的 :/

XOXO,

椰干

DROP TABLE TEMPXMOP24;

CREATE TABLE TEMPXMOP24
(
   MOPID VARCHAR2(12),
   TYPE VARCHAR2(200),
   MOPSTART DATE,
   MOPAPPROVEDTIME DATE,
   TIME_DIF VARCHAR2(45),
   FIXED_MOP VARCHAR2(12)
);

INSERT INTO TEMPXMOP24 (MOPID,TYPE,MOPSTART,MOPAPPROVEDTIME,TIME_DIF,FIXED_MOP)
SELECT MOPACTIVITY.MOPID,
MOPACTIVITY.MOPSERVICEIMPACTED "TYPE",
MOPACTIVITY.MOPSTART,
MOPACTIVITY.MOPAPPROVEDTIME,
ROUND(MOPACTIVITY.MOPSTART -  MOPACTIVITY.MOPAPPROVEDTIME,2)||' days' "TIME_DIF",
    (CASE 
        WHEN SUBSTR(MOPACTIVITY.MOPID, 7, 2) = '24' THEN SUBSTR(MOPACTIVITY.MOPID, 1, 6)||'00'||SUBSTR(MOPACTIVITY.MOPID, 9, 4)
        ELSE MOPACTIVITY.MOPID
    END ) FIXED_MOP
FROM MOPUSER.MOPACTIVITY
WHERE MOPACTIVITY.MOPSTART -  MOPACTIVITY.MOPAPPROVEDTIME BETWEEN 0 and 14;

SELECT * FROM TEMPXMOP24
WHERE TRUNC(TO_DATE(TEMPXMOP24.FIXED_MOP, 'MMDDYYHH24MISS'))
  BETWEEN TRUNC(SYSDATE-90) AND TRUNC(SYSDATE)
于 2013-06-11T13:12:57.113 回答