Самый старый код в MSSQL

Ваш покорный слуга работал с MSSQL с версии 6.5, но в качестве экзотики застал версии 6.0 и 4.2. Да, я супер стар!

Но осталось ли в MS SQL что-либо с тех времен?

Кодовая база

Динозавры от IT, вероятно, помнят, что MS SQL — это форк Sybase, случившийся в 1993 году. Версии Sybase 4.2 и MSSQL 4.2 были, как я понимаю, полностью совместимыми. Более того, так как MSSQL опережала Sybase с развитием GUI, то Management Studio от MSSQL использовали для Sybase.

Дальше кодовая база стала отличаться, но совместимость сохранялась, по моему, до версии 6.5. Внешне Management Studio тогда сильно отличался от современного. Например, вы создавали database devices, и располагали на них базу или разные базы. То есть один файл мог относиться к разным базам.

51c8bc8c83ebea7133a0c187de30dbd1.png

Глобальный редизайн продукт претерпел в 1998 году с выходом версии 7.0, которая уже примерно выглядела так, как выглядит сейчас. Однако в кодовой базе было еще много кода, доставшегося от Sybase в наследство, и только в версии 2005 наконец весь код был переписан.

Я слышал, что в Microsoft был даже неформальный праздник по поводу выкидывания последней строчки Sybase. На пути к этому этапу им часто приходилось решать проблемы: в коде Sybase найден баг. Исправлять и кто-то использует такое поведение?

Таким образом, весь код MSSQL сейчас не старше 1998 года — версии 7.0. Но…

Преданья старины глубокой

Но в MS SQL есть активно используемые технические решения, которые ведут свое происхождение из начала 90х!

Вы наверняка знаете, о чем я:

8a090ccdea1ba0da2e9dafd95c32d944.png

Дата запуска, время запуска, время выполнения — это просто целые числа, в которых кодируются времена и даты в самом обкуренном из возможных вариантов. Например, если вы ходите перевести длительность в секунды, и получить время запуска как datetime, то можете написать примерно такой код:

select 
  dateadd(ss,runtimeh*3600+runtimem*60+runtimes,convert(datetime,convert(varchar,run_date))) as rundate,
  runtimeh*3600+runtimem*60+runtimes as runtime_seconds,
  durh*3600+durm*60+durs as duration_seconds
from (
select top 10 
  run_time/10000 as runtimeh, run_time/100%100 as runtimem, run_time%100 as runtimes, 
  run_duration/10000 as durh, run_duration/100%100 as durm, run_duration%100 as durs,
  run_date
  from msdb..sysjobhistory) Q

Или воспользоваться недокументированной функцией agent_datetime:

https://blog.sqlauthority.com/2015/03/13/sql-server-interesting-function-agent_datetime/

Код выше уродлив, но работать будет быстрее, чем функция.

Почему же так вышло?

SQL agent уже существовал в версии 4.2. Соответственно, это извращение было сделано в Sybase. Почему? Скорее всего потому, что типы date и time появились много позже, вначале же существовал datetime, который не совсем подходит для этой задачи (например, расписание часто содержит время без даты).

Не думаю, что это когда-либо исправят. Но если бы появились view в msdb где видны нормальные значения, то это было бы здорово.

Ну и, как сейчас принято на Хабр, подписывайтесь на мой телеграмм канал. Хотя… черт, у меня нет никакого телеграмм канала…

© Habrahabr.ru