喜欢比较不工作的日期

时间:2017-04-27 14:12:17

标签: oracle enterprise-library

我在项目中使用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,因为我们正在升级系统,此更改会导致记录中的排序顺序不同。

3 个答案:

答案 0 :(得分:4)

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'
  

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

如果您需要使用LIKE,则可以执行以下操作:

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

但是,更改过滤条件不应更改排序顺序。

答案 1 :(得分:0)

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

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

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

你每天都学到新东西。

答案 2 :(得分:0)

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

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