喜欢比较日期不工作
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')
我在项目中使用 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')