SNAFU privado vai para o DBA


Para quem não sabe, SNAFU é um personagem de desenhos animados patrióticos militares criados por americanos durante a guerra. Essa goivagem, devido à idiotice natural, cai em situações catastróficas o tempo todo e, em regra, morre no final da série. É verdade que, na próxima série, ele está novamente vivo - nesse sentido, ele pode ser considerado o progenitor distante de Kenny de South Park.

Ao recrutar pessoas para a posição de desenvolvedor do servidor SQL, eu frequentemente era submisso ao modo como elas respondiam às perguntas. Eu estava pronto para dizer SIM se não tivesse sido salvo por uma pequena tarefa de uma linha que meu colega sugeriu. É incrível o quanto essa tarefa pode produzir em uma única string SQL. E agora o candidato já caminha rake com entusiasmo. Um ancinho, como você verá, há muitos. Obviamente, nenhuma pessoa coletou TODOS os possíveis rakes. Mas para mostrar a todos, eu precisava do SNAFU.

Então, a tarefa:

SELECT * FROM Events where DT='2020/02/03'

  • O que o autor do código queria fazer?
  • Por que isso não pode funcionar como eu queria?
  • Como corrigi-lo?

Minha conversa com a SNAFU vai além.

SNAFU: Obviamente, a consulta seleciona dados para um dia.
Eu: E o que há de errado nisso?
SNAFU: Bem, existe um asterisco, seria melhor indicar os campos ...
Eu: E o que está armazenado na tabela, o que você acha? E que tipo de campo é DT?
SNAFU: Eventos ... Hora dos eventos ... Então, nessa data
Me: Bem?
SNAFU: (após deliberação) aah, então, se houver tempo, as notas serão lidas somente depois da meia-noite
I: excelente

Superamos os dois primeiros pontos e passamos para o terceiro.

Eu: Como consertar?
SNAFU: onde convert (varchar, DT, 102) = '2020/02/03' (o rake nº 1 funcionou)
I:Mas não te incomoda que isso possa impedir o SQL de usar o índice DT, se ele estiver lá?
SNAFU: onde a TD entre '2020/02/03' e '2020/02/04' (o Rake nº 2 funcionou)
Eu: Incomoda você que os dados para o próximo número (meia-noite) também sejam incluídos aqui?
SNAFU: onde DT entre '2020/02/03' e '2020/02/03 23:59:59' (rake nº 3 funcionou)
I: Você gostaria de lidar com um banco no qual há um segundo quando há dinheiro, que você contribuiu será perdido?
SNAFU: onde DT entre '2020/02/03' e '2020/02/03 23: 59: 59.999' (Rake # 4 funcionou)
I: Você sabia que 23: 59: 59.999 serão arredondados novamente até meia-noite?
SNAFU:Exatamente, a granularidade é de 13 a 16 ms. Então: onde o DT entre '2020/02/03' e '2020/02/03 23: 59: 59.986' (o rake nº 5 funcionou)
Eu: Ou seja, se o DT se tornar smalldatetime ou datetime2, tudo deixará de funcionar?



Não sei por que a transição para o momento abaixo é tão difícil. Na realidade, mais da metade dos candidatos estão estupidamente desesperados. Às vezes você precisa avisar. Mas nosso SNAFU torturou uma solução:

SNAFU: onde DT> = '2020/02/03' e DT <'2020/02/04'
Eu: Finalmente.

SNAFU enxuga o suor da testa. Agora é a hora de uma tomada de controle.
Eu: E o que mais é realmente ruim aqui?
SNAFU está tremendo. Suas mãos estão tremendo. O olhar vagueia.
Eu: É 3 de fevereiro ou 2 de março?

Parece-me que essas tarefas dão entendimento muito mais rápido do que as idiotas "tarefas de teste". Nesse caso, o SNAFU pode ser um cara legal, mas ele trabalhou pouco com dados temporais, e é melhor não deixá-lo entrar no setor financeiro.


All Articles