Private SNAFU va a DBA


Para aquellos que no saben, SNAFU es un personaje de dibujos animados patrióticos militares creados por estadounidenses durante la guerra. Este corte, debido a la idiotez natural, cae en situaciones catastróficas todo el tiempo y, por regla general, muere al final de la serie. Es cierto que en la próxima serie vuelve a estar vivo; en este sentido, puede considerarse el progenitor distante de Kenny de South Park.

Cuando reclutaba personas para el puesto de desarrollador del servidor SQL, a menudo era sumiso a cómo respondían las preguntas. Estaba listo para decirles SÍ si no me hubiera salvado una pequeña tarea de una línea que sugirió mi colega. Es sorprendente cuánto puede producir esta tarea en una sola cadena SQL. Y ahora el candidato ya camina con entusiasmo. Un rastrillo, como verás, hay muchos. Por supuesto, ni una sola persona recolectó TODOS los rastrillos posibles. Pero para mostrarlos a todos, necesitaba SNAFU.

Entonces, la tarea:

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

  • ¿Qué quería hacer el autor del código?
  • ¿Por qué esto no puede funcionar como yo quería?
  • ¿Como arreglarlo?

Mi conversación con SNAFU irá más allá.

SNAFU: Obviamente, la consulta selecciona datos para un día.
Yo: ¿Y qué hay de malo en eso?
SNAFU: Bueno, hay un asterisco, sería mejor indicar los campos ...
Yo: ¿Y qué se almacena en la tabla, qué piensas? ¿Y qué tipo de campo es DT?
SNAFU: Eventos ... Hora de los eventos ... Entonces datetime
Yo: ¿Y bien?
SNAFU: (después de deliberar) aah, así que si hay tiempo, las notas se leerán solo después de la medianoche
I: excelente

Hemos superado los dos primeros puntos y pasamos al tercero.

Yo: ¿Cómo arreglarlo?
SNAFU: donde convert (varchar, DT, 102) = '2020/02/03' (Rake # 1 funcionó)
I:Pero, ¿no le molesta que esto pueda evitar que SQL use el índice DT si está allí?
SNAFU: donde DT entre '2020/02/03' y '2020/02/04' (Rake # 2 funcionó)
Yo: ¿Le molesta que los datos para el próximo número (medianoche) también se incluyan aquí?
SNAFU: donde DT entre '2020/02/03' y '2020/02/03 23:59:59' (Rake # 3 funcionó)
I: ¿Le gustaría tratar con un banco en el que hay un segundo cuando hay dinero, que contribuiste se perderá?
SNAFU: donde DT entre '2020/02/03' y '2020/02/03 23: 59: 59.999' (Rake # 4 funcionó)
I: ¿Sabía que 23: 59: 59.999 se redondeará nuevamente hasta la medianoche?
SNAFU:Exactamente, allí la granularidad es de 13-16 ms. Entonces: donde DT entre '2020/02/03' y '2020/02/03 23: 59: 59.986' (Rake # 5 funcionó)
Yo: Es decir, si DT se vuelve pequeño datetime o datetime2, ¿dejará de funcionar todo?



No sé por qué la transición al momento a continuación es tan difícil. En realidad, más de la mitad de los candidatos son estúpidamente tontos. A veces tienes que preguntar. Pero nuestro SNAFU torturó una solución:

SNAFU: donde DT> = '2020/02/03' y DT <'2020/02/04'
Yo: Finalmente.

SNAFU se limpia el sudor de la frente. Ahora es el momento para una toma de control.
Yo: ¿Y qué más es realmente malo aquí?
SNAFU está temblando. Le tiemblan las manos. La mirada vaga.
Yo: ¿Es el 3 de febrero o el 2 de marzo?

Me parece que tales tareas dan una comprensión mucho más rápida que las "tareas de prueba" idiotas. En este caso, SNAFU puede ser un buen tipo, pero trabajó poco con datos temporales, y es mejor no dejarlo ingresar al sector financiero.


All Articles