Le SNAFU privé va à DBA


Pour ceux qui ne le savent pas, le SNAFU est un personnage des caricatures militaires patriotiques créées par les Américains pendant la guerre. Ce gougeage, dû à l'idiotie naturelle, tombe tout le temps dans des situations catastrophiques et, en règle générale, meurt à la fin de la série. Certes, dans la prochaine série, il est à nouveau vivant - en ce sens, il peut être considéré comme le lointain ancêtre de Kenny de South Park.

Lors du recrutement de personnes pour le poste de développeur SQL Server, j'étais souvent soumis à la façon dont ils répondaient aux questions. J'étais prêt à leur dire OUI si je n'avais pas été sauvé par une petite tâche d'une ligne que mon collègue avait suggérée. Il est étonnant de voir combien cette tâche peut produire dans une seule chaîne SQL. Et maintenant, le candidat marche déjà avec enthousiasme. Un râteau, comme vous le verrez, il y en a beaucoup. Bien sûr, pas une seule personne n'a collecté TOUS les râteaux possibles. Mais pour tout leur montrer, j'avais besoin de SNAFU.

Donc, la tâche:

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

  • Que voulait faire l'auteur du code?
  • Pourquoi cela ne fonctionne-t-il pas comme je le voulais?
  • Comment le réparer?

Ma conversation avec la SNAFU ira plus loin.

SNAFU: De toute évidence, la requête sélectionne des données pour une journée.
Moi: Et qu'est-ce qui ne va pas avec ça?
SNAFU: Eh bien, il y a un astérisque, il vaudrait mieux indiquer les champs ...
Moi: Et qu'est-ce qui est stocké dans le tableau, qu'en pensez-vous? Et quel type de champ est DT?
SNAFU: Événements ... Heure des événements ... Donc datetime
Moi: Eh bien?
SNAFU: (après délibération) aah, donc s'il y a du temps, alors les notes ne seront lues qu'après minuit
I: excellent

Nous avons surmonté les deux premiers points et passons au troisième.

Moi: Comment y remédier?
SNAFU: où convertir (varchar, DT, 102) = '2020/02/03' (Rake # 1 a fonctionné)
I:Mais cela ne vous dérange pas que cela puisse empêcher SQL d'utiliser l'index DT s'il est là?
SNAFU: où DT entre '2020/02/03' et '2020/02/04' (Rake # 2 a fonctionné)
Moi: Cela vous dérange-t-il que les données pour le prochain numéro (minuit) soient également incluses ici?
SNAFU: où DT entre '2020/02/03' et '2020/02/03 23:59:59' (Rake # 3 a fonctionné)
I: Souhaitez-vous traiter avec une banque dans laquelle il y a une seconde quand il y a de l'argent, que vous avez contribué sera perdu?
SNAFU: où DT entre '2020/02/03' et '2020/02/03 23: 59: 59.999' (Rake # 4 travaillé)
I: Savez-vous que 23: 59: 59.999 sera à nouveau arrondi jusqu'à minuit?
SNAFU:Exactement, la granularité est de 13 à 16 ms. Ensuite: où DT entre '2020/02/03' et '2020/02/03 23: 59: 59.986' (Rake # 5 a fonctionné)
Moi: Autrement dit, si DT devient smalldatetime ou datetime2, tout cessera-t-il de fonctionner?



Je ne sais pas pourquoi la transition vers l'instant ci-dessous est si difficile. En réalité, plus de la moitié des candidats sont stupidement désespérés. Parfois, vous devez demander. Mais notre SNAFU a torturé une solution:

SNAFU: où DT> = '2020/02/03' et DT <'2020/02/04'
Moi: Enfin.

SNAFU essuie la sueur de son front. Il est maintenant temps pour un coup de contrôle.
Moi: Et quoi d'autre est vraiment mauvais ici?
SNAFU tremble. Ses mains tremblent. Le regard s'égare.
Moi: Est-ce le 3 février ou le 2 mars?

Il me semble que de telles tâches donnent une compréhension beaucoup plus rapide que les "tâches de test" idiotes. Dans ce cas, le SNAFU est peut-être un bon gars, mais il a peu travaillé avec les données temporelles, et il vaut mieux ne pas le laisser entrer dans le secteur financier.


All Articles