Есть ли техническая причина, почему в программировании формат даты по умолчанию - ГГГГММДД, а не что-то еще?

118

Есть ли какая-то инженерная причина, почему это так? В случае СУБД мне было интересно, что она как-то связана с производительностью, поскольку, например, «ГОД» более специфичен, чем «МЕСЯЦ»: у вас есть только один год 2000, но каждый год «Январь», что облегчит / ускорит фильтрацию / сортировку чего-либо по году в первую очередь, и поэтому год идет первым.

Но я не знаю, имеет ли это смысл ... Есть ли вообще причина?

lucaswxp
источник
14
@IMil Нам это может не нравиться, но довольно часто они хранятся в виде строк.
Хонза Брабек
14
@candied_orange Это было бы странно, особенно в случае дат.
glglgl
43
xkcd.com/1179
Helio
19
В качестве примечания, этот формат не является , что чуждо. Например, на венгерском языке (и, возможно, на некоторых других) YYYY. ММ. DD. является форматом письменной даты по умолчанию, и он был задолго до компьютеров.
Нейнштейн
31
В программировании формат даты по умолчанию - «ГГГГММДД»? Было бы хорошо, если бы это было правдой, но это определенно не везде. RFC 822 и RFC 850, а также ANSI C по- asctimeпрежнему широко используются во многих местах. Приятно, что RFC 3339 и ISO 8601 постепенно вытесняют старые форматы, и они, безусловно, должны использоваться в будущем. В более общем смысле я бы сказал, что базовая форма ISO 8601 (обычная ГГГГММДД без символов-разделителей) на самом деле встречается реже, чем некоторые другие формы, такие как ГГГГ-ММ-ДД.
Даниэль Приден

Ответы:

386

Таким образом, даты могут быть легко отсортированы в виде строк с использованием правил сортировки по умолчанию (т.е. лексикографическая сортировка ).

По этой же причине месяц и день указываются с использованием двух цифр (при необходимости добавляется начальный ноль).

Фактически это один из форматов даты, определенных ISO 8601 . Этот стандарт также определяет формат даты и времени 2015-03-27T15:26:40Z, который также можно сортировать в виде строк.

Тем не менее, YYYYMMDD имеет дополнительное преимущество, заключающееся в том, что он позволяет легко (без подстрок или замены символов) анализировать строку как целое число и по-прежнему использовать порядок по умолчанию для целых чисел.

Арсений Мурзенко
источник
90
@lucaswxp: Если вы пишете сравнение в особых случаях для строк, следующих за определенной схемой, вы, конечно, можете сделать это как угодно в стиле барокко. Дело в том, что схема спроектирована таким образом, что лексический порядок (а также порядок с учетом лексических чисел) также является логическим порядком, поэтому нет необходимости настраивать его.
дедупликатор
19
@lucaswxp Ваша строка даты может быть не в памяти. Практический пример: у вас есть CSV-файл, уже отсортированный по дате ISO и миллионам + строк в год. И вы хотите вернуть только строки между определенными датами. Вы можете читать файл построчно (строка за строкой), пока не достигнете своей первой даты, а затем загрузить строки в память, пока не достигнете своей последней даты. Вы можете пропустить остальную часть файла. Но если вы сохраните дату в каком-либо другом формате или отсортированы только по годам, вам придется прочитать записи за весь год, прежде чем закрывать файл.
Том А. Вибето,
48
Обратите внимание, что тире являются необязательными в ISO 8601, поэтому YYYYMMDD - это ISO 8601.
Martin Ba
32
@ Бенуа Предложение уже сделано для решения проблемы Y10K. Если мы все еще будем использовать ту же эпоху, то перейдем к AYYYYYMMDD до Y100K, что будет BYYYYYYMMDD, CYYYYYYYMMDD, DYYYYYYYYMMDD, EYYYYYYYYYMMDD. Этот ведущий альфа-префикс обеспечивает правильный порядок сортировки (при условии, что "A0YYYY ..." и т. Д. Являются недопустимыми представлениями, если все еще используются даты YYYY ...). В какой-то момент, когда число лет делится на три, мы начнем добавлять три цифры каждый раз, когда меняем альфа-префикс, чтобы убедиться, что у нас не заканчиваются буквы до тепловой смерти вселенной.
Монти Хардер
35
Важно отметить, что с этим форматом сортировка не просто «проще». Лексическая (символьная) сортировка становится эквивалентной временной сортировке, что означает, что вы можете сортировать по времени без разбора .
jpmc26
135

Пока не упоминается, но вы быстро замаскируете порядок внутри YYYY. Это уже тысячелетия, века, десятилетия, годы. То есть YYYY уже заказан от самого длинного периода к самому короткому периоду. То же самое касается ММ и ДД, так работает система счисления.

Таким образом, чтобы сохранить порядок между полями в соответствии с порядком в полях, единственным вариантом является ГГГГММДД.

Как отметил Захбаз и Арсений Мурзенко, форматы ГГГГММДД легко сортируются. Это не случайное совпадение, это прямое следствие того, что поля с наибольшей длительностью ставятся первыми (и с фиксированной длиной; здесь мы вводим проблему Y10K).

MSalters
источник
34
Хотя вы, возможно, шутите, этот код может нас преследовать через 8000 лет. Код живет дольше, чем кто-либо ожидает ... 😓
deceze
15
@deceze ISO8601 уже имеет положения для пятизначного года, но было бы интересно узнать, какие реализации DateTime в настоящее время позволяют это делать.
Зак Фарагер
4
@ZacFaragher, я уверен, у нас будет достаточно времени, чтобы реализовать это позже, не нужно спешить, верно ...?
ilkkachu
51
@deceze Почему вы разморозили меня - вы выяснили, как вылечить рак? Нет, это 9999 год, и ты знаешь КОБОЛ.
user3067860
6
Вы можете исправить вашу опечатку. Слово тысячелетия , множественное число тысячелетия , обязательно пишется с двойным N, чтобы соответствовать двойному N в годовом значении от латинского annus за год. Когда вы неправильно пишете его с помощью единственного N, теперь он, к несчастью, совпадает с единичным N анального из латинского ануса с тем же значением, что и его заимствованное слово в английских видах спорта. Короче говоря, вам всегда нужно произносить это по буквам так, что вы говорите о тысячах лет, а не о тысячах дыр. :)
tchrist
57

Есть ли какая-то причина вообще?

Да. Эти части программного обеспечения будут использовать ISO 8601 .

ISO 8601 имеет ряд преимуществ перед другими форматами даты:

  • Это стандарт со спецификацией документа :)
  • Это однозначно. мм / дд / гггг и дд / мм / гггг могут сбивать с толку, если не прошло 13-го дня.
  • Он лексикографически сортирует по возрастанию, поэтому никакой специальной логики сортировки даты не требуется. Это особенно полезно в именах файлов, где сортировка лексикографических чисел часто сбивает с толку (например 1_file, 10_file, 2_file).
  • Это требует 4-значного года и нуля с добавлением месяца и года. Это позволяет избежать проблемы 2000 года и других неясностей.

Что касается того, почему ISO 8601 существует в первую очередь, это потому, что люди находили форматы дат неоднозначными и запутанными при обмене данными между странами / системами, и им нужно что-то однозначное.

Обоснование см. Во введении спецификации .

Хотя Рекомендации и Стандарты ИСО в этой области доступны с 1971 года, в разных странах широко используются различные формы числового представления дат и времени. Когда такие представления пересекаются через национальные границы, может произойти неправильное толкование значимости цифр, что приведет к путанице и другим косвенным ошибкам или потерям. Цель настоящего международного стандарта состоит в том, чтобы устранить риск неправильного толкования и избежать путаницы и ее последствий.

...

Этот международный стандарт сохраняет наиболее часто используемые выражения для даты и времени дня и их представления из более ранних международных стандартов и предоставляет уникальные представления для некоторых новых выражений, используемых на практике. Его применение в обмене информацией, особенно между системами обработки данных и соответствующим оборудованием, устранит ошибки, возникающие из-за неправильного толкования и связанных с этим затрат. Продвижение этого международного стандарта не только облегчит обмен через международные границы, но также улучшит мобильность программного обеспечения и облегчит проблемы связи как внутри организации, так и между организациями.

Стандарт определяет «базовые» вариации как минимизацию использования разделителей. Итак, YYYYMMDDявляется основной альтернативой расширенному формату YYYY-MM-DD.

стручок
источник
4
Я не знал, что ISO 8601 также допускает YYYYMMDD помимо YYYY-MM-DD.
keuleJ
iso.org/iso-8601-date-and-time-format.html указывает на то, что «Расширенный формат» YYYY-MM-DD является единственным форматом для 8601?
Оскар Остегард
3
@keuleJ Минимизация использования разделителей, таких как ГГГГММДД, а не ГГГГ-ММ-ДД, называется «базовым» изменением формата в стандарте ISO 8601.
Базилик Бурк
Еще два преимущества стандарта ISO 8601: (а) простота разбора на машине без использования символа ПРОБЕЛ и без локализованного текста, и (б) простота интуитивного восприятия людьми в разных культурах, причем год, который будет первым, будет легко узнать (если он современный) и без знания английского языка.
Базилик Бурк
55

Это потому, что все другие способы сделать это неоднозначны.

01/02/2003 что это значит? Второго января 2003 года? Или в Европе: 1 февраля 2003 года? Это становится еще хуже, если вы используете две цифры в году, как 01/02/03.

Вот почему вы используете ГГГГММДД, это соглашение, которое позволяет нам четко сообщать о датах, 20030201 как дата всегда ясна. (и это облегчает сортировку)

(Теперь не храните это как целое число 20 миллионов 30 тысяч двести 1. пожалуйста, хорошо? Довольно пожалуйста?)

Питер Б
источник
14
«20030201 как дата всегда ясна» : это абсолютно не так. Это так же неоднозначно, как и «01/02/2003», если только вы не знаете, что используется формат ГГГГММДД (или ГГГГДДММ или ДДММГГГГ? ...). Вы ВСЕГДА должны знать формат даты; не существует "конвенции", которая делает вещи однозначными.
скомиса
6
@skomisa, это совершенно неверно. ISO 8601 определил формат даты международного стандарта специально по указанным вами причинам. Ни один из других форматов не является допустимым форматом даты и не существует с 19880605
К. Алан Бейтс
11
@ K.AlanBates Ваша дата неоднозначна, если только мы не предполагаем, что она должна быть проанализирована в соответствии с ISO 8601.
Гойо
16
20030201 это 20 марта 201AD, верно?
Дэвид Ричерби
10
@ Martijn, но зависит от языка. В Турции это скорее Любат, чем февраль (Прежде чем думать, что ваш код работает, всегда проверяйте Турцию ).
НХ.
19

Пусть t1 и t2 будут разными целыми числами, которые представляют два раза записанные в формате ГГГГММДД. Тогда t1 <t2 означает, что t2 произошло после t1.

Вы теряете этот порядок с первым форматированием DD и MM.

ИСО, ИМО, единственный разумный формат.

zahbaz
источник
1
За исключением того, что вы никогда не сохраните это как целое число, по крайней мере, я никогда не видел и не рассматривал это.
труба
5
@pipe: Поверьте мне, некоторые люди будут. Мы поддерживаем устаревшую систему, которая хранит YYYYMMDD в виде целых чисел. Проект, вероятно, возник в некоторой старой системе баз данных без явного типа даты и был сохранен для обратной совместимости. Это не красиво. Не делай этого.
Хайнци
19
@pipe Мой опыт работы в индустрии программного обеспечения заключается в том, что всякий раз, когда разумный человек захочет сказать «Но ты никогда не сделаешь Х», всегда есть хотя бы один встречный пример
Джозеф Роджерс
5
@pipe В хранилищах данных нередко используется целое число ггггммдд в качестве первичного / суррогатного ключа для таблицы дат.
мыльный агент
4
@pipe, ну, порядковый номер зоны DNS - это 32-разрядное целое число, которое должно быть увеличено при изменении зоны. Хотя это может быть просто обычное число, обычной идиомой является использование чисел, таких как 2018092601 ... Тогда есть несколько любопытных определений магических чисел, описанных в feature_test_macros(7), например, наличие _POSIX_C_SOURCE > 200809Lсредств, поддерживающих функции из POSIX.1-2008 ...
ilkkachu
12

Одна вещь, не упомянутая, состоит в том, что в интерактивных входах этот формат позволяет управлять вводом.

Система не может знать, имеет ли месяц 28, 29, 30 или 31 день, не зная конкретного года и месяца. Когда в интерактивном режиме ввода указывается, что год и месяц появляются первыми, он может проверить, находится ли день (вставленный последним) в допустимом диапазоне.

Конечно, вопрос был в основном о формате даты, но можно утверждать, что формат даты следует форматированию, представленному пользователю.

Мартин
источник
7

ГГГГММДД заказывает даты так же, как вы заказываете номера: сначала самая значительная часть. ММДДГГГ было бы похоже на запись «сто двадцать три» как «двадцать сто три».

В нашей культуре у нас есть естественное понимание MMDDYYYY, потому что, как люди, мы осознаем время, и годы прогрессируют медленно. Мы вообще знаем, какой это год. Видеть год редко имеет значение, поэтому мы отодвигаем его назад. Месяцы сменяются достаточно быстро, чтобы сохранить свое значение. Другие культуры справляются с этим по-разному. Большая часть мира предпочитает ДДММГГГГ.

Джоэл Коухорн
источник
62
Возможно, вы захотите перефразировать «нашу культуру», потому что в моей культуре это DDMMYYYY, так что это не «наша» культура, а только ваша
slebetman
66
Комплексная карта всех стран, которые используют формат даты MMDDYYYY img-9gag-fun.9cache.com/photo/a2mXmGd_700b.jpg
Peregrine,
9
Похоже на странный аргумент: «Месяцы меняются достаточно быстро, чтобы сохранить свою значимость» -> Почему бы не поставить день на первое место, поскольку это меняется еще быстрее?
Вим Deblauwe
7
@JoelCoehoorn, это легко сделать явным («В нашей культуре США»). «наш» / «мы» часто используется здесь для обозначения «сообщества стек-обмена».
АНОЭ
14
Именно так. Stackoverflow является международным . То, что вы находитесь в США, не говорит, не подразумевает и даже не повышает вероятность того, что другие тоже. Вы не можете делать какие-либо предположения о местонахождении ваших читателей здесь, они по всему миру. И большинство ваших читателей будут не вы, ни ОП, а другие люди, которые найдут ваш ответ в Google. Этот самый комментарий написан на другом континенте, чем тот, на котором вы живете. И хотя у нас есть свои собственные - эм - интересные привычки, мы, безусловно, не используем здесь MM / DD / YYYY ...
cmaster
6

Сортировка была упомянута, но наиболее полезной причиной для этого является сравнение их как «строк», и да, 26-символьная временная метка упорядочена аналогично.

Я знаю, что такие сравнения необходимы для сортировки, но в целом это полезно для сортировки из 2 элементов.

Я работал над проектами, где это не было принято, и да, программисты пытались (со смешанными результатами) сравнивать даты как строки.

Хорошее форматирование для клиентской стороны или для набора текста.

mckenzm
источник
5

Этот формат делает алфавитный порядок строк идентичным хронологическому порядку дат. Это полезно, потому что многие инструменты обеспечивают алфавитное упорядочение, например, файлов по имени, но не позволяют анализировать произвольно отформатированные даты по именам файлов и сортировать по ним.

WolfgangGroiss
источник
4

Это об ограниченности. Представьте YEAR, MONTH и DAY в качестве параметров, в формате YYYYMMDD каждый параметр является более строгим, чем предыдущий.

Поэтому, если вы хотите найти что-то, что произошло в 1970 году, вы можете сделать это путем поиска строки, начинающейся с "1970*", но если вы помните, какой месяц был, вы можете добавить месяц как "197005*". Таким образом, каждый «параметр» даты дает вам более конкретную информацию.

Это единственный способ перейти от менее конкретной информации ( "1970*") к более конкретной информации ( "19700523").

mrvinent
источник
3
Не очень хороший аргумент - такой же обычный поиск вещей происходит в определенные месяцы, а не в конкретные годы.
Куб
1
Если 1970*и 197005*представляют синтаксис подстановочного знака «glob», то вы можете выполнить поиск по группе дат MMDDYYYY, выполнив поиск по запросу glob *1970или 05*1970. Ваш ответ может быть неявным, предполагая некоторые дополнительные ограничения, которые вы не упомянули явно, и может быть улучшен путем объяснения вашего предположения.
Quuxplusone
3
Это своего рода побочный эффект или другой способ описания порядка ключей сортировки, упомянутых в других ответах. Но это объяснение развалится, если вы не ограничите его поиском по префиксам. (Проще индексировать, но ни в коем случае не требуется).
Питер Кордес
Это также означает, что вы можете выбрать последовательность дат с помощью относительно простых регулярных выражений ...
Harper
1

Почему в программировании формат даты по умолчанию - ГГГГММДД ...

Это удобочитаемый формат для ввода и вывода, он не обязательно хранится таким образом.

Более трети всех языков программирования были разработаны в стране, где основным языком является английский, и большинство современных придерживаются стандарта некоторого описания - международного стандарта дат ISO 8601 .

Больше информации: (TMI?)

По мере изменения времени, обычно вперед, сначала увеличиваются дни, а затем месяцы и, наконец, годы - может быть легче понять, если бы у нас были десятичные датыдесятичное время ) - с течением времени число становится больше. Людям просто проще взглянуть на число и сравнить его с другой датой.

Компьютер не заботится о том, какую структуру вы хотите использовать, и на большинстве (но не на всех ) компьютерах используется двоичная логика - база e на самом деле имеет самую низкую экономию радиуса, но не является ни самой эффективной, ни самой простой для полной последовательности .

Фактический формат ввода и вывода даты варьируется в зависимости от страны и определяется локализацией , в то время как ГГГГММДД может показаться наиболее целесообразным, и то, к чему вы привыкли, сегодня не является универсальным , как и в прошлом. дольше времени, но даже сегодня римские цифры которые обычно используются для дат .

Зная год вперед, вы узнаете, сколько дней в году - самое большое изменение продолжительности года. Он сообщает вам заранее количество дней в каждом месяце (для проверки ошибок при вводе), разрешая ввод дня, который может потребоваться вначале, чтобы поддержать вас, если следующий год не согласуется с вашим вводом - возможно, затрудняя доступный ввод , Это также имеет значение в отношении формата календаря . Смотрите также календарь компьютерщиков с его десятичными звёздами.

Что касается компьютера, то он, вероятно, будет использовать время эпохи UNIX , количество секунд, прошедших с 00:00:00 всемирного координированного времени (UTC), четверг, 1 января 1970 года, где каждый день рассматривается так, как если бы он содержал ровно 86400 секунд. Смотрите также юлианский день . Эгоцентричный человек предпочитает формат ГГГГММДД , а МАС рассматривает год как юлианский год, равный 365,25 дням (31,5576 млн. Секунд), если не указано иное.

обкрадывать
источник
1
Фактически почти каждый человек и часть программного обеспечения, которую я когда-либо встречал, предпочитают какой-то другой формат.
Гойо
1
Рад встрече с вами! Я Дэйв, и я предпочитаю YYYYMMDD
Обратный инженер
0

Другое использование, которое я видел для этого представления, заключается в том, что вы можете хранить даты в виде целых чисел (то есть в базе данных), используя только 4 байта на дату. Использование YYYYMMDD означает, что целочисленные сравнения (часто это одна машинная инструкция) имеют тот же результат, что и сравнения на представленную дату. И это печатает в меру читабельно. И ни для чего из этого не требуется никакого кода или специальной поддержки вообще в любой основной среде программирования.

Если эти вещи представляют собой большую часть того, что вам нужно делать с датами, и вам нужно делать много, то этот формат очень привлекателен.

Для сравнения, даты в распространенных форматах, таких как ДД / ММ / ГГГГ, принимают 10 байтов в виде строк символов ASCII. Строки YYYYMMDD уменьшают это значение до 8 и получают преимущество «сравнение представлений дает тот же результат, что и сравнение дат», но даже тогда сравнение на основе строк является посимвольным, а не однозначным сравнением.

Бен
источник
2
Упорядочить дату в три байта тривиально. Диапазон 0000 ~ 9999 требует 14 битов, 01 ~ 12 требует 4 бита, а 01 ~ 31 требует 5 битов, что в сумме составляет 23 бита. Используя также оставшийся бит в трехбайтовом количестве, вы можете представлять даты за период в 32 768 лет с сохранением однодневного разрешения. Это можно использовать, например, для представления дат в диапазоне от 8191 до н.э. до 24576 г. н.э. Упаковывая биты как, скажем, yyyyyyyyyyyyyyymmmmddddd, десятичное представление остается прямо сопоставимым (хотя и не читаемым непосредственно человеком, но кого волнует физическое хранилище базы данных?).
CVn
0

По этой же причине Луна состоит из зеленого сыра: это не так. В большинстве случаев формат по умолчанию - это какая-то локализованная строка. Иногда используется формат ISO, но обычно с черточками для лучшей читаемости. YYYYMMDD(или %Y%m%dна strftimeязыке) редко используется по умолчанию. Чтобы быть справедливым, я уверен, что видел это, но я не могу думать о примере прямо сейчас.

Дата Unix (основные утилиты GNU)

date

Выход:

Wed Sep 26 22:20:57 CEST 2018

питон

import time
print(time.ctime())

выход:

Wed Sep 26 22:27:20 2018

С

#include <stdio.h>
#include <time.h>

int main () {
   time_t curtime;

   time(&curtime);
   printf(ctime(&curtime));
   return(0);
}

Выход:

Wed Sep 26 22:40:01 2018

C ++

#include <ctime>
#include <iostream>

int main()
{
    std::time_t result = std::time(nullptr);
    std::cout << std::ctime(&result);
}

Выход:

Wed Sep 26 22:51:22 2018

Javascript

current_date = new Date ( );
current_date;

Выход:

Wed Sep 26 2018 23:15:22 GMT+0200 (CEST)

SQLite

SELECT date('now');

Выход:

2018-09-26

LibreOffice Calc

введите описание изображения здесь

Gnumeric

введите описание изображения здесь

OnlyOffice

введите описание изображения здесь

Python + NumPy

import numpy as np
pd.datetime64('now')

Выход:

numpy.datetime64('2018-09-26T21:31:55')

Питон + панды

import pandas as pd
pd.Timestamp('now', unit='s')

Выход:

Timestamp('2018-09-26 21:47:01.277114153')

Программная инженерия

введите описание изображения здесь

apport.log

ERROR: apport (pid 9742) Fri Sep 28 17:39:44 2018: called for pid 1534, signal 6, core limit 0, dump mode 2

alternatives.log

update-alternatives 2018-05-08 15:14:24: run with --quiet --install /usr/bin/awk awk /usr/bin/mawk 5 --slave /usr/share/man/man1/awk.1.gz awk.1.gz /usr/share/man/man1/mawk.1.gz --slave /usr/bin/nawk nawk /usr/bin/mawk --slave /usr/share/man/man1/nawk.1.gz nawk.1.gz /usr/share/man/man1/mawk.1.gz

Чашки / access.log

localhost - - [28/Sep/2018:16:41:58 +0200] "POST / HTTP/1.1" 200 360 Create-Printer-Subscriptions successful-ok

системный журнал

Sep 28 16:41:46 pop-os rsyslogd:  [origin software="rsyslogd" swVersion="8.32.0" x-pid="946" x-info="http://www.rsyslog.com"] rsyslogd was HUPed
Goyo
источник
10
добавим к вашему аргументу, сколько из них отформатировано таким образом из-за пользовательских настроек компьютера, на котором вы запускали скрипт?
Тофер Бринк
Первый из них на самом деле не "bash", это программа даты (и она выводит Do 27. Sep 22:27:09 CEST 2018здесь.)
Paŭlo Ebermann
@ PaŭloEbermann Вы правы, я надеюсь, что сейчас лучше. Как я уже сказал, многие из этих форматов локализованы, поэтому фактический формат, который вы видите, будет зависеть от ваших вариантов локализации.
Гойо
3
Хотя смысл этого ответа верен для ориентированных на конечного пользователя приложений, это не так для обмена данными между системами, сериализации данных, протоколов сообщений / данных, регистрации, трассировки, отладчиков и так далее. Стандарт ISO 8601 быстро становится нормой для такого использования, предназначенного для системных администраторов и программистов. То же самое для международных или локальных сценариев.
Базилик Бурк
@BasilBourque Спасибо, я добавил случайную выборку журналов, найденных в моей собственной системе. У меня нет примеров других типов под рукой. Но я не думаю, что тенденция к дефолту к ISO 8601 в определенных областях делает его базовый вариант «стандартным в программировании» перед лицом огромного количества программного обеспечения, которое по умолчанию использует другие форматы.
Гойо
-1

Дополнительное преимущество, не упомянутое до сих пор, состоит в том, что желаемое квантование (назначение точного значения как принадлежащего тому же общему диапазону значений) является относительно простой и быстрой единственной операцией.

Предположим, вы пишете отчет, который суммирует события сегодня, такие как сумма и количество продаж. Дата и время продажи хранятся в формате ГГГГММДДЧЧММИС, вам просто нужно сохранить крайние левые 8 символов (если это строка) или целочисленное деление (т. Е. Пол), чтобы сократить дату и время до даты продажи.

Точно так же, если вы хотите продажи за месяц, оставьте только 6 самых левых цифр или разделите на 100 000 000

Конечно, вы можете утверждать, что возможны любые манипуляции со строками, дата-время для продаж «12-25-2018 12:34 pm» может быть подставлена ​​в подстроки и манипулирована несколько раз, чтобы получить месяц и год. В числовой форме 122520181234 можно было бы разделить и изменить, умножить и еще немного разделить, и, в конечном счете, также создать месяц и год ... ... но код будет действительно трудно писать, читать, поддерживать и понимать.

И даже сложные оптимизаторы базы данных могут не иметь возможности использовать индекс по столбцу для предложения where, если форма даты была MM / DD / YYYY, но вырезана и сложена обратно вместе. Для сравнения, хранение представления ГГГГММДД и отсутствие декабря 2018 года приводит к тому, что предложения типа dateasstring LIKE '201812%'или dateasint BETWEEN 20181200 and 20181299что-то, что может легко использоваться для индекса

Таким образом, если не было выделенного типа данных для дат, а строковое / числовое представление было единственным выбором, используя и сохраняя времена в некотором представлении «самый длинный интервал слева направо к самому короткому интервалу» Право имеет довольно много преимуществ для простоты понимания, манипулирования, хранения, поиска и обслуживания кода

Caius Jard
источник