喜欢比较日期不工作

Like to compare date not working

我在项目中使用 Enterprise library 6.0 在 Oracle 数据库中执行查询。

当我执行以下命令时,没有找到任何记录:

SELECT ACS.COD_IDENT_FMACO,
               ACO.NOM_IDENT_ACO,
               ACS.COD_CICLO_SIGA,
               to_char(ACS.DTH_ALOC_CICLO, 'DD/MM/YYYY HH24:MI:SS'),
               ACS.SEQ_PROCE_ALOC,
               UM.COD_UNIMET_PCP,
               UM.COD_UNIMET_SIP,
               PERR.ESP_UNIMET_ETAPA,
               PERR.LAR_UNIMET_ETAPA,
               PERR.COM_UNIMET_ETAPA,
               PERR.PES_LIQUIDO,
               ACS.COD_INTER_PEDCL,
               ACS.COD_ITEM_PEDCL,
               IP.NUM_PEDID_MAINF,
               C.COD_IDENT_CLIEN,
               C.NOM_ABREV_PESSO,
               IP.DAT_MAIOR_PLANE,
               PD.COD_GRUPO_PROAC,
               PD.COD_QUASU_PROAC,
               PER.VLR_TOMIN_ESPES,
               PER.ESP_MM_PRODT,
               PER.VLR_TOMAX_ESPES,
               PER.VLR_TOMIN_LARGU,
               PER.LAR_MM_PROAC,
               PER.VLR_TOMAX_LARGU,
               ACS.PES_ALOC_SIGA,
               IP.PES_MINIM_DESEJ,
               IP.PES_DESEJ_ITEM,
               IP.PES_MAXIM_DESEJ,
               PD.PES_MIN_PACOT,
               PD.PES_MAX_PACOT
        FROM PR_ALOC_CICLO_SIGA ACS,
             PR_PRODUTO_ETAPA_ROTINA_REALIZ PERR,
             CM_ITEM_PC IP,
             CM_CLIENTE C,
             PR_ROTINA_FABRC R,
             PR_ETAPA_ROTINA ER,
             PR_PRODT_ETAPA_ROT PER,
             PR_PRODUTO PD,
             PR_UNIDADE_METALICA UM,
             PR_ACO ACO
        WHERE ACS.COD_INTER_PEDCL = IP.COD_INTER_PEDCL
          AND ACS.COD_ITEM_PEDCL = IP.COD_ITEM_PEDCL
          AND IP.COD_IDENT_CLIEN = C.COD_IDENT_CLIEN
          AND ACS.COD_CICLO_SIGA = '60'
          AND ER.COD_AREA_PROCE = 'Q'
          AND ER.COD_OPERA_FABRC IN('TQ007',
                                    'TQ013')
          AND IP.COD_INTER_PEDCL = R.NUM_IDENT_PEDID
          AND IP.COD_ITEM_PEDCL = R.NUM_ITEM_PEDID
          AND R.NUM_ROTIN_FABRC = ER.NUM_ROTIN_FABRC
          AND R.NUM_VERSA_ROTIN = ER.NUM_VERSA_ROTIN
          AND R.IDC_SITUA_ROTIN IN ('A',
                                    'P')
          AND R.IDC_SITUA_ROTIN = 'A'
          AND ER.NUM_ROTIN_FABRC = PER.NUM_ROTIN_FABRC
          AND ER.NUM_VERSA_ROTIN = PER.NUM_VERSA_ROTIN
          AND ER.NUM_ETAPA_ROTIN = PER.NUM_ETAPA_ROTIN
          AND IP.COD_IDENT_CLIEN = PD.COD_IDENT_CLIEN
          AND IP.COD_LINHA_PRODT = PD.COD_LINHA_PRODT
          AND IP.NUM_SEQ_PRODT = PD.NUM_SEQ_PRODT
          AND IP.NUM_SEQ_REVIS = PD.NUM_SEQ_REVIS
          AND ACS.COD_UNIMET_PCP = UM.COD_UNIMET_PCP
          AND UM.COD_UNIMET_PCP = PERR.COD_UNIMET_PCP
          AND PERR.SEQ_ETAPA_ROTINA_REALIZADA = UM.SEQ_ULTIM_ETAPA
          AND PD.COD_IDENT_ACO = ACO.COD_IDENT_ACO
          AND ACS.DTH_ALOC_CICLO LIKE TO_DATE('15/10/2015','DD/MM/YYYY')
          AND 'I' LIKE '%'||IP.COD_LINHA_PRODT|| '%'
          AND IP.COD_LINHA_PRODT IS NOT NULL
          AND 1 = 1
        ORDER BY IP.COD_INTER_PEDCL,
                 IP.COD_ITEM_PEDCL,
                 IP.NUM_PEDID_MAINF

但是如果我换行

AND ACS.DTH_ALOC_CICLO LIKE TO_DATE('15/10/2015','DD/MM/YYYY')

来自

AND ACS.DTH_ALOC_CICLO BETWEEN TO_DATE('15/10/2015'||'00:00:00', 'DD/MM/YYYY HH24:MI:SS')
                       AND     TO_DATE('15/10/2015'||'23:59:59', 'DD/MM/YYYY HH24:MI:SS')

结果返回正确。

在 C# 或企业库中有什么配置可以理解这个命令吗?

注意:我需要用 like 执行,因为我们正在升级系统,此更改会导致记录中的排序顺序不同。

删除我的原始答案,因为在 12c 上进行了测试,结果证明这是可行的。

where date_col like to_date('2017/04/01', 'yyyy/mm/dd')

即使我的 NLS 设置不是 'yyyy/mm/dd'

你每天都能学到新东西。

ACS.DTH_ALOC_CICLO LIKE TO_DATE('15/10/2015','DD/MM/YYYY')

将在两个日期之间进行字符串比较,并使用对 TO_CHAR( datevalue, format_mask ) 函数的隐式调用将它们转换为字符串,使用 NLS_DATE_FORMAT 会话参数作为格式掩码。

如果将其设置为包含时间部分,则它将仅匹配时间部分为 00:00:00.

的行
AND ACS.DTH_ALOC_CICLO BETWEEN TO_DATE('15/10/2015'||'00:00:00', 'DD/MM/YYYY HH24:MI:SS')
                       AND     TO_DATE('15/10/2015'||'23:59:59', 'DD/MM/YYYY HH24:MI:SS')

将值作为日期进行比较(并且能够在列上使用索引)。

你也可以这样做:

AND ACS.DTH_ALOC_CICLO >= DATE '2015-10-15'
AND ACS.DTH_ALOC_CICLO <  DATE '2015-10-15' + INTERVAL '1' DAY -- or DATE '2015-10-16'

I need to execute with like because we are upgrading a system and this change cause different sort order in records.

如果您需要使用 LIKE 那么您可以这样做:

TO_CHAR( ACS.DTH_ALOC_CICLO, 'DD/MM/YYYY' ) LIKE '15/10/2015'

但是,更改筛选条件不应更改排序顺序。

发生这种情况是因为 ACS.DTH_ALOC_CICLO 字段中的时间可能不完全在 00:00:00。解决这个问题的简单方法是使用 trunc()。

AND TRUNC(ACS.DTH_ALOC_CICLO) = TO_DATE('15/10/2015','DD/MM/YYYY')