Как стать автором
Обновить

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

Уровень сложностиПростой
Время на прочтение2 мин
Количество просмотров9.1K

Ваш покорный слуга работал с 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, и располагали на них базу или разные базы. То есть один файл мог относиться к разным базам.

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

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

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

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

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

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

Дата запуска, время запуска, время выполнения - это просто целые числа, в которых кодируются времена и даты в самом обкуренном из возможных вариантов. Например, если вы ходите перевести длительность в секунды, и получить время запуска как 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.

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

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

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

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

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

Теги:
Хабы:
Всего голосов 28: ↑28 и ↓0+28
Комментарии18

Публикации

Истории

Ближайшие события

19 августа – 20 октября
RuCode.Финал. Чемпионат по алгоритмическому программированию и ИИ
МоскваНижний НовгородЕкатеринбургСтавропольНовосибрискКалининградПермьВладивостокЧитаКраснорскТомскИжевскПетрозаводскКазаньКурскТюменьВолгоградУфаМурманскБишкекСочиУльяновскСаратовИркутскДолгопрудныйОнлайн
3 – 18 октября
Kokoc Hackathon 2024
Онлайн
24 – 25 октября
One Day Offer для AQA Engineer и Developers
Онлайн
25 октября
Конференция по росту продуктов EGC’24
МоскваОнлайн
7 – 8 ноября
Конференция byteoilgas_conf 2024
МоскваОнлайн
7 – 8 ноября
Конференция «Матемаркетинг»
МоскваОнлайн
15 – 16 ноября
IT-конференция Merge Skolkovo
Москва
25 – 26 апреля
IT-конференция Merge Tatarstan 2025
Казань