Какое побитовое представление у типа DATETIME(6)?

Согласно документации от разработчиков MariaDB:

1 bit sign (1= non-negative, 0= negative)

17 bits year*13+month (year 0-9999, month 0-12)

5 bits day (0-31)

5 bits hour (0-23)

6 bits minute (0-59)

6 bits second (0-59)

40 bits = 5 bytes

(Взято отсюда https://dev.mysql.com/doc/internals/en/date-and-time-data-type-representation.html)

  1. Не понимаю строчку про год-месяц. На месяц нужно 4 бита, тогда на год остаётся 13, но этого недостаточно для диапазона 0-9999. Поясните, пожалуйста.
  2. Далее в документации указано, что для хранения 6 цифр после запятой используются 3 байта — дробная часть секунды. Но для диапазона 0-999999 достаточно 20 бит, значит, где-то будет дырка в 4 бита или нули?

Подскажите, пожалуйста, представление или как мне его проверить. Нужно это для обработки в C++ коде, т.е. 8 байт передаются и хранятся просто в ULL, а дальше из них выделяются год, месяц и т.п.


Ответы (1 шт):

Автор решения: Akina

Не понимаю строчку про год-месяц. На месяц нужно 4 бита, тогда на год остаётся 13, но этого недостаточно для диапазона 0-9999. Поясните, пожалуйста.

Ну русским же по белому пишут: year*13+month

Т.е. от 0*13 + 0 = 0 и до 9999*13 + 12 = 129999. Вполне в 17 бит (0 - 131071) укладывается.

Далее в документации указано, что для хранения 6 цифр после запятой используются 3 байта — дробная часть секунды. Но для диапазона 0-999999 достаточно 20 бит

Может, там BCD, по 4 бита на цифру. А даже если и не BCD - всё равно оставшиеся 4 бита ни на что не пустить...

→ Ссылка