DATETIME start DATETIME end
Я закликаю вас замість цього використовувати два значення DATETIME , позначені на зразок event_start та event_end .
Час - це складний бізнес
Зараз більшість країн світу прийняла метричну систему на основі денерів для більшості вимірювань, правильно чи неправильно. Це добре в цілому, оскільки, принаймні, ми можемо погодитися, що ag, є мл, є кубічним див. Принаймні приблизно так. Метрична система має багато недоліків, але, принаймні, на міжнародному рівні послідовно недоліки.
Однак з часом ми маємо; 1000 мілісекунд за секунду, 60 секунд до хвилини, 60 хвилин до години, 12 годин кожні пів дня, приблизно 30 днів на місяць, які залежать від відповідного місяця та навіть року, кожна країна має зміщення часу від інших , спосіб форматування часу в кожній країні відрізняється.
Переварити багато, але довго та коротко неможливо, щоб такий складний сценарій мав просте рішення.
Деякі куточки можна вирізати, але є такі, де розумніше не робити
Хоча головна відповідь тут говорить про те, що зберігання цілого числа минулої півночі може здатися цілком розумним, я навчився уникати цього важким шляхом.
Причини впровадження двох значень DATETIME полягають у збільшенні точності, роздільної здатності та зворотного зв'язку.
Це все дуже зручно, коли дизайн дає небажані результати.
Чи я зберігаю більше даних, ніж потрібно?
Спочатку може здатися, що більше інформації зберігається, ніж мені потрібно, але є вагомий привід скористатися цим зверненням.
Зберігання цієї додаткової інформації майже завжди закінчує економію часу та зусиль у довгостроковій перспективі, тому що я неминуче знаходжу, що коли комусь скажуть, як довго щось пройшло, вони також захочуть знати, коли і де відбулася подія.
Це величезна планета
У минулому я був винним, що ігнорував, що на цій планеті є інші країни, окрім моєї власної. Тоді це здавалося гарною ідеєю, але це ЗАВЖДИ призводило до проблем, головних болів і даремно витрачається час пізніше. ЗАВЖДИ враховуйте всі часові пояси.
C #
DateTime добре відображає рядок у C #. Метод ToString (строковий формат) є компактним і легким для читання.
Напр
new TimeSpan(EventStart.Ticks - EventEnd.Ticks).ToString("h'h 'm'm 's's'")
SQL-сервер
Крім того, якщо ви читаєте свою базу даних окремо до інтерфейсу вашого додатка, тоді dateTimes можуть бути прочитані з першого погляду і виконання обчислень на них просто.
Напр
SELECT DATEDIFF(MINUTE, event_start, event_end)
Стандарт дати ISO8601
Якщо ви використовуєте SQLite, у вас цього немає, тому замість цього використовуйте поле Text та зберігайте його у форматі ISO8601, наприклад.
"2013-01-27T12: 30: 00 + 0000"
Примітки:
Для цього використовується цілодобовий годинник *
Час зміщення часу (або +0000) частини ISO8601 відображається безпосередньо на значенні довготи GPS-координатора (без урахування літнього часу або в країні).
Напр
TimeOffset=(±Longitude.24)/360
... де ± відноситься до східного або західного напрямку.
Тому варто подумати, чи варто зберігати довготу, широту та висоту разом із даними. Це залежатиме від застосування.
ISO8601 - це міжнародний формат.
Вікі дуже хороша для отримання детальної інформації на веб-сайті http://en.wikipedia.org/wiki/ISO_8601 .
Дата та час зберігаються у міжнародному часі, а зміщення записується залежно від того, де у світі зберігався час.
На мій досвід, завжди є необхідність зберігати повну дату та час, незалежно від того, чи я вважаю, що є, коли я починаю проект. ISO8601 - це дуже хороший, безпечний у майбутньому спосіб.
Додаткова порада безкоштовно
Також варто згрупувати події разом, як ланцюжок. Наприклад, якщо записати гонку, вся подія може бути згрупована за участю гонщика, race_circuit, krug_checkpoints та krug_laps.
На мій досвід, також розумно визначити, хто зберігав запис. Або як окрема таблиця, заповнена через тригер, або як додаткова колонка в початковій таблиці.
Чим більше ви вкладаєте, тим більше виходите
Я цілком розумію прагнення бути максимально економним з простором, але я б рідко робив це за рахунок втрати інформації.
Основне правило з базами даних - це, як зазначає заголовок, база даних може повідомити вам лише стільки, скільки має даних, і повернутись через історичні дані, заповнивши прогалини, дуже дорого.
Рішення полягає в тому, щоб виправити це правильно вперше. Це, звичайно, простіше сказати, ніж зробити, але тепер вам слід глибше зрозуміти ефективне проектування баз даних і згодом мати набагато кращі шанси виправити це правильно в перший раз.
Чим краще ваш початковий проект, тим менше коштують ремонти пізніше.
Я все це кажу лише тому, що якби я міг повернутись у часі, то це те, що я сказав би собі, коли потрапив туди.