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 / dba / Perguntas / 149997
Accepted
Sir Swears-a-lot
Sir Swears-a-lot
Asked: 2016-09-19 19:17:38 +0800 CST2016-09-19 19:17:38 +0800 CST 2016-09-19 19:17:38 +0800 CST

A comparação de data na subconsulta falha com: "valor fora do intervalo"

  • 772

Eu tenho uma instrução de atualização que usa uma subconsulta para filtrar registros. Minha tabela de entrada contém datas em um campo varchar e algumas delas são inválidas.

CREATE TABLE [dbo].[input](
    [id] int,
    [START_DATE] [varchar](30) NULL
) ON [PRIMARY]

INSERT INTO [dbo].[input] ([id], [START_DATE]) VALUES(1, NULL) ;
INSERT INTO [dbo].[input] ([id], [START_DATE]) VALUES(2, '') ;
INSERT INTO [dbo].[input] ([id], [START_DATE]) VALUES(3, '01 JUL 0201') ;
INSERT INTO [dbo].[input] ([id], [START_DATE]) VALUES(4, '01 JUL 2016') ;

Nos dados de amostra, apenas o registro 4 é válido.

Minha consulta:

select a.[id] 
FROM (
    select [id], convert(datetime, [START_DATE],106) as csd
    FROM [dbo].[input]
    where len([START_DATE]) > 0     
    and substring([START_DATE],7,5) > 2010
    and isdate([START_DATE]) = 1
    ) a
    Where a.csd < getdate()

Eu brinquei com várias cláusulas para excluir lixo:

  • len > 0 exclui nulos e ''.
  • Substring procura um ano sensato.
  • isdate verifica novamente se há uma data válida.

Tenho certeza de que existem outras maneiras mais eficientes de fazer isso, mas o ponto é que a subconsulta é executada e retorna registros válidos corretamente. neste caso, id = 4. Que tem uma data válida em 1º de julho de 2016.

A consulta externa deve simplesmente comparar a data convertida com a data de hoje. Mas em vez disso eu recebo:

Msg 242, Level 16, State 3, Line 2
The conversion of a varchar data type to a datetime data type resulted in an out-of-range value.

Por quê? O que estou perdendo?

A consulta interna filtrou e converteu o valor que estou avaliando.

Existe uma maneira melhor de filtrar essa lista para ser usada em uma consulta de atualização?

sql-server-2008 t-sql
  • 1 1 respostas
  • 186 Views

1 respostas

  • Voted
  1. Best Answer
    svtr
    2016-09-19T23:46:09+08:002016-09-19T23:46:09+08:00

    A ordem de execução depende muito do otimizador de consulta. Portanto, no seu caso, mesmo que o código SQL que você escreveu pareça que a subconsulta filtraria as datas inválidas primeiro, a aparência da execução real da consulta pode ser muito diferente.

    Você pode executar sua consulta com a opção (forçar ordem), mas tenha cuidado com essa, muito cuidado, e saiba o que realmente está fazendo. Outra opção seria uma tabela temporária, para pré-selecionar as datas válidas ou inválidas, mas isso também poderia ser muito caro.

    Embora pareça sujo, e é, você também pode comparar valores de string, para não se deparar com esse problema, apenas certifique-se de usar uma página de código que classificará como uma string como faria como uma data

    select a.[id] 
    FROM (
        select [id], convert(varchar(23), convert(datetime, [START_DATE],106),121) as csd
        FROM [dbo].[input]
        where len([START_DATE]) > 0     
        and substring([START_DATE],7,5) > 2010
        and isdate([START_DATE]) = 1
        ) a
        Where a.csd < convert(varchar(23, getdate(), 121)
    

    em suma, seria melhor salvar start_date como um tipo de data real.

    • 4

relate perguntas

  • Melhores práticas para conectar bancos de dados que estão em diferentes regiões geográficas

  • Quais são as principais causas de deadlocks e podem ser evitadas?

  • Quanto "Padding" coloco em meus índices?

  • Existe um processo do tipo "práticas recomendadas" para os desenvolvedores seguirem para alterações no banco de dados?

  • Downgrade do SQL Server 2008 para 2005

Sidebar

Stats

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

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

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