1. SQL / Говнокод #13290

    −172

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    7. 7
    8. 8
    9. 9
    select cast(
          substring(cast(active_start_date as varchar(8)), 1, 4) + '-' 
          + substring(cast(active_start_date as varchar(8)), 5, 2) + '-' 
          + substring(cast(active_start_date as varchar(8)), 7, 2) + ' '
          + substring(RIGHT('000000'+cast(active_start_time as varchar(6)), 6), 1, 2) + ':' 
          + substring(RIGHT('000000'+cast(active_start_time as varchar(6)), 6), 3, 2) + ':' 
          + substring(RIGHT('000000'+cast(active_start_time as varchar(6)), 6), 5, 2)  
          as datetime) ExecutionDateTime
    from sysschedules

    Майкрософт, зачем ты хранишь даты и время в integer? :(

    Запостил: DBdev, 03 Июля 2013

    Комментарии (7) RSS

    • Чтобы можно было делать + - / и прочие полезные операции.
      А вот зачем автор сего говна по сто раз делает одинаковый cast - уже более интересный вопрос...
      Ответить
      • Как-то мимо утки с полезностью.
        active_start_date
        20120331 + 1 = 20120332 (expected -> 20120401, внезапно, 32-ое марта)
        active_start_time
        59 + 1 = 60 (expected -> 100, внезапно, 60-я секунда после полуночи)

        > А вот зачем автор сего говна по сто раз делает одинаковый cast - уже более интересный вопрос...
        Да тут как-бы особо и не выкрутишься, но Ваш вариант с удовольствием посмотрим :)
        ЗЫЖ Я - не автор, но особо претензий к запросу не имею ибо тут что-то элегантного и красивого не сделаешь...
        Ответить
        • Я не силён в SQL(несколько запросов в БД сервера WoW посылал по молодости), но, как мне кажется, должен быть какой - то перфоманс хак, чтобы не вычислять выражение cast(active_start_date as varchar(8)) по несколько раз...
          Ответить
    • Чтобы часовые пояса не сбивались.
      Ответить
      • чтобы понимать даты до 1 января 1970 с помощью отрицательных чисел
        Ответить
        • у майкрософта была своя таймстампина в формате ms-dos epoch:
          в 2 байта к с 1980года на 127 лет вперед. из особенностей - на секунды выделено 5 бит, которыми можно закодировать значение секунды от 0 до 30, которые на фронтенде умножались на 2, таким образом точность 2 секунды.
          на википедии в статье про FAT описано.
          а еще аццкий метод определения версии FAT.
          Ответить
    • А я, после прочтения одного поста на ГК, ссылку запамятовал, храню в бд TIMESTAMP :p
      И на фронте верчу как хочу
      Ответить

    Добавить комментарий