AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / coding / Perguntas / 79573663
Accepted
teenup
teenup
Asked: 2025-04-15 00:53:25 +0800 CST2025-04-15 00:53:25 +0800 CST 2025-04-15 00:53:25 +0800 CST

Por que a comparação de datas não está funcionando nesta consulta SQL?

  • 772

Estou recebendo este erro:

Erro ao converter o tipo de dados nvarchar para bigint

Quando tento executar a consulta abaixo, se eu remover a condição de comparação de datas, funciona perfeitamente.

 select c.reference AccountNo,
        i.insurance_cancellation_dt CustomerCancelDte,
        cus.ext_name CustomerName,
        case when f.amt_matched=0 then 'Paid' else 'Unpaid' end ChargebackStatus,
        '' DlrCancelRequiredInd,
        acf.reference NetcheckAccountNo,
        iType.value ProductDesc,
        acf.amount TotRefundAmt,
        iParty.ext_name VendorName,
        v.vin_no Vin
from 
    contract c 
inner join 
    asset_hdr ah on c.contract_id = ah.current_contract_id 
                 and c.dealer_id = 1201 
                 and c.reference = '100981'
inner join 
    asset_hdr_insurance i on i.asset_hdr_id = ah.asset_hdr_id
--   and i.insurance_cancellation_dt > '2025-01-01'
--   and i.insurance_cancellation_dt < '2025-04-01'
inner join 
    party cus on cus.party_id = c.cparty_id
inner join 
    asset_custom_flow acf on acf.reference = i.asset_hdr_insurance_id
                          and acf.custom_flow_hdr_id = (select custom_flow_hdr_id 
                                                        from custom_flow_hdr 
                                                        where name = 'AMP Chargeback')
inner join 
    flow f on f.contract_id = c.contract_id 
           and f.custom_flow_link_no = acf.link_no
inner join 
    xt_lookupset iStatus on iStatus.xt_lookupset_id = i.insurance_status
inner join 
    xt_lookupset iType on iType.xt_lookupset_id = i.insurance_type
inner join 
    party iParty on iParty.party_id = i.insurance_party_id
inner join 
    asset_class_vehicle v on v.asset_hdr_id = ah.asset_hdr_id
                          and v.vin_no = 'TTXJG330ML5P34985'
sql
  • 3 3 respostas
  • 87 Views

3 respostas

  • Voted
  1. Best Answer
    Joel Coehoorn
    2025-04-15T01:02:16+08:002025-04-15T01:02:16+08:00

    Isso parece um problema de esquema, onde o insurance_cancellation_dté definido incorretamente como um int grande.

    Com isso em mente, a melhor solução é consertar os dados (porque o que você realmente tem seria considerado quebrado ). Mas entendo que isso nem sempre é possível em um sistema existente.

    Com isso em mente, não posso ter certeza da solução exata sem ver uma amostra de como são os dados reais, mas imagino que as linhas comentadas provavelmente se pareçam mais com isto:

    and i.insurance_cancellation_dt >= 20250101
    and i.insurance_cancellation_dt <  20250401
    

    Observe a mudança no operador para a primeira expressão de desigualdade. O operador original parecia errado e provavelmente deveria ser usado >=em vez de >(mas o operador <rather than <=provavelmente está correto).


    Além disso, vejo isto:

    and c.reference='100981'
    

    Não acho que essa seja a causa do seu erro, e normalmente eu o consideraria normal, mas como potencialmente temos outras situações de incompatibilidade de tipos na consulta, pode haver algo aqui que valha a pena abordar. Se c.referencefor, na verdade, um tipo numérico de algum tipo, em vez de um tipo string/varchar, as regras de precedência de tipos do SQL Server podem exigir a conversão de TODOS os c.referencevalores para varchar, em vez de converter '100981'para o tipo numérico uma vez. Seria necessário fazer isso para cada linha , mesmo para valores que não correspondam à expressão... porque, de que outra forma, saberia se o valor correspondeu ou não? Pior ainda, isso impede o uso de qualquer índice que você possa ter para esta coluna.


    Agora temos esta nova informação:

    insurance_cancellation_dté uma data e hora ... Também funciona se eu remover i.asset_hdr_id=ah.asset_hdr_ide manter a comparação de data

    É estranho que a remoção de expressões condicionais resolva o problema (daí: uma postagem no Stack Overflow 😉). Se houvesse um problema de conversão de tipo em outro lugar, mais expressões condicionais tenderiam a reduzir o tamanho do conjunto de resultados, o que poderia ajudar a evitar o erro, enquanto a remoção de uma expressão tenderia a adicionar linhas e, portanto, aumentar a chance de erro. Isso faz o oposto.

    Ainda assim: o otimizador de consultas pode fazer coisas estranhas. Por exemplo, adicionar uma expressão pode levar a percorrer um índice estreito em vez de buscar em uma tabela mais ampla, ou vice-versa. Dessa forma, adicionar a expressão pode significar que você visualiza mais linhas, mas tem menos leituras de página. Há outros motivos pelos quais isso também pode gerar resultados estranhos.

    O certo é que, em algum lugar, isso está causando uma conversão de um tipo de dado ( nvarchar) para outro ( bigint) que você não pretendia. Prestar mais atenção aos tipos de dados de coluna e literais permitirá que você evite isso.

    Vale ressaltar também que não há literais " nvarcharou bigint" em nenhuma parte da consulta. nvarcharprecisaria de um Nprefixo, e não há nada numérico grande o suficiente para bigint. Também não há operações de conversão na SELECTcláusula. Portanto, DEVE ser uma conversão ocorrendo dentro de uma expressão condicional entre duas colunas em uma cláusula " ONou WHERE". Eu prestaria mais atenção a estas três expressões:

    acf.reference = i.asset_hdr_insurance_id
    iStatus.xt_lookupset_id = i.insurance_status
    iType.xt_lookupset_id = i.insurance_type
    

    Onde for possível, uma das colunas insurance_status, insurance_type, ou acf.referencecontém principalmente strings que representam valores de ID nas tabelas pareadas, mas são definidas para nvarchartambém permitir uma gama mais ampla de informações de status/descritivas em algumas linhas. Lembre-se: strings que representam valores de ID não são a mesma coisa que conter os valores de ID diretamente.

    • 1
  2. Pooja Gupta
    2025-04-15T01:33:29+08:002025-04-15T01:33:29+08:00

    É muito provável que esse problema ocorra porque o SQL Server está interpretando i.insurance_cancellation_dtcomoNVARCHAR (string), não como DATE.

    Abaixo estão as correções:

    1). Converta a coluna para DATEa condição :

    E CAST(i.insurance_cancellation_dt COMO DATA) > '2025-01-01'

    E CAST(i.insurance_cancellation_dt COMO DATA) < '2025-04-01'

    2): Corrigir o tipo de coluna (ideal):

    Verifique o tipo de dados real de i.insurance_cancellation_dt:

    SELECT DATA_TYPE 
    FROM INFORMATION_SCHEMA.COLUMNS 
    WHERE TABLE_NAME = 'asset_hdr_insurance'
       AND COLUMN_NAME = 'insurance_cancellation_dt';
    

    O erro fornecido parece ocorrer quando você adiciona ( e porque o servidor pode i.insurance_cancellation_dt > '2025-01-01'reordenar) internamente as etapas de execução (junções, filtros) e tentar corresponder uma coluna a uma na linha (se esses tipos não corresponderem).nvarcharbigintacf.reference = i.asset_hdr_insurance_id

    Espero que esta solução ajude!

    • 1
  3. RE0
    2025-04-15T01:03:04+08:002025-04-15T01:03:04+08:00

    Acho que é por causa de c.references='100981'. Por causa do , ''ele será interpretado como string (nvarchar).

    Você já tentou isso? :

     select c.reference AccountNo,
            i.insurance_cancellation_dt CustomerCancelDte,
            cus.ext_name CustomerName,
            case when f.amt_matched=0 
                then 'Paid' 
                else 'Unpaid' 
            end ChargebackStatus,
            '' DlrCancelRequiredInd,
            acf.reference NetcheckAccountNo,
            iType.value ProductDesc,
            acf.amount TotRefundAmt,
            iParty.ext_name VendorName,
            v.vin_no Vin
    from contract c 
    inner join asset_hdr ah on c.contract_id = ah.current_contract_id 
    and c.dealer_id = 1201 
    and c.reference = 100981
    inner join asset_hdr_insurance i on i.asset_hdr_id = ah.asset_hdr_id
    
    • 0

relate perguntas

  • Atualizando todas as linhas, exceto uma que tenha os mesmos valores em determinadas colunas

  • Existe uma maneira de inverter apenas os números quando eu retornar uma coluna sql? (hebraico)

  • SQL menor/maior comparação entre booleanos produz resultados inesperados

  • Como atualizar valores na tabela Postgres com base em uma correspondência em uma matriz

  • Como somar colunas no sql server

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Reformatar números, inserindo separadores em posições fixas

    • 6 respostas
  • Marko Smith

    Por que os conceitos do C++20 causam erros de restrição cíclica, enquanto o SFINAE antigo não?

    • 2 respostas
  • Marko Smith

    Problema com extensão desinstalada automaticamente do VScode (tema Material)

    • 2 respostas
  • Marko Smith

    Vue 3: Erro na criação "Identificador esperado, mas encontrado 'import'" [duplicado]

    • 1 respostas
  • Marko Smith

    Qual é o propósito de `enum class` com um tipo subjacente especificado, mas sem enumeradores?

    • 1 respostas
  • Marko Smith

    Como faço para corrigir um erro MODULE_NOT_FOUND para um módulo que não importei manualmente?

    • 6 respostas
  • Marko Smith

    `(expression, lvalue) = rvalue` é uma atribuição válida em C ou C++? Por que alguns compiladores aceitam/rejeitam isso?

    • 3 respostas
  • Marko Smith

    Um programa vazio que não faz nada em C++ precisa de um heap de 204 KB, mas não em C

    • 1 respostas
  • Marko Smith

    PowerBI atualmente quebrado com BigQuery: problema de driver Simba com atualização do Windows

    • 2 respostas
  • Marko Smith

    AdMob: MobileAds.initialize() - "java.lang.Integer não pode ser convertido em java.lang.String" para alguns dispositivos

    • 1 respostas
  • Martin Hope
    Fantastic Mr Fox Somente o tipo copiável não é aceito na implementação std::vector do MSVC 2025-04-23 06:40:49 +0800 CST
  • Martin Hope
    Howard Hinnant Encontre o próximo dia da semana usando o cronógrafo 2025-04-21 08:30:25 +0800 CST
  • Martin Hope
    Fedor O inicializador de membro do construtor pode incluir a inicialização de outro membro? 2025-04-15 01:01:44 +0800 CST
  • Martin Hope
    Petr Filipský Por que os conceitos do C++20 causam erros de restrição cíclica, enquanto o SFINAE antigo não? 2025-03-23 21:39:40 +0800 CST
  • Martin Hope
    Catskul O C++20 mudou para permitir a conversão de `type(&)[N]` de matriz de limites conhecidos para `type(&)[]` de matriz de limites desconhecidos? 2025-03-04 06:57:53 +0800 CST
  • Martin Hope
    Stefan Pochmann Como/por que {2,3,10} e {x,3,10} com x=2 são ordenados de forma diferente? 2025-01-13 23:24:07 +0800 CST
  • Martin Hope
    Chad Feller O ponto e vírgula agora é opcional em condicionais bash com [[ .. ]] na versão 5.2? 2024-10-21 05:50:33 +0800 CST
  • Martin Hope
    Wrench Por que um traço duplo (--) faz com que esta cláusula MariaDB seja avaliada como verdadeira? 2024-05-05 13:37:20 +0800 CST
  • Martin Hope
    Waket Zheng Por que `dict(id=1, **{'id': 2})` às vezes gera `KeyError: 'id'` em vez de um TypeError? 2024-05-04 14:19:19 +0800 CST
  • Martin Hope
    user924 AdMob: MobileAds.initialize() - "java.lang.Integer não pode ser convertido em java.lang.String" para alguns dispositivos 2024-03-20 03:12:31 +0800 CST

Hot tag

python javascript c++ c# java typescript sql reactjs html

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve