Должен ли я использовать тип данных datetime или timestamp в MySQL?

Это должно сделать это:

In [12]: L
Out[12]: ['name1', 'name2', 'name3', 'name4', 'name5', 'name6']

In [13]: for i in range(0,len(L),3): print ' '.join(L[i:i+3])
name1 name2 name3
name4 name5 name6

EDIT: получить все в фиксированную ширину (некоторый код, который я написал некоторое время, чтобы превратить столбчатые данные в таблицу. Все, что вам нужно сделать, это columnize ваши данные и вызов этого старого кода):

def tabularize(infilepath, outfilepath, delim='\t', largeFile=False):
        """ Return nothing
                Write into the file in outfilepath, the contents of infilepath, expressed in tabular form.
                The tabular form is similar to the way in which SQL tables are displayed.
                If largeFile is set to True, then no caching of lines occurs. However, two passes of the infile are required"""

        if largeFile:
                widths = getWidths(infilepath, delim)
        else:
                with open(infilepath) as infile:
                        lines = [line.strip().split(delim) for line in infile.readlines() if line.strip()]
                widths = [max([len(row) for row in rows])+2 for rows in izip_longest(*lines, fillvalue="")]

                with open(outfilepath, 'w') as outfile:
                        outfile.write("+")
                        for width in widths:
                                outfile.write('-'*width + "+")
                        outfile.write('\n')
                        for line in lines:
                                outfile.write("|")
                                for col,width in izip_longest(line,widths, fillvalue=""):
                                        outfile.write("%s%s%s|" %(' '*((width-len(col))/2), col, ' '*((width+1-len(col))/2)))
                                outfile.write('\n+')
                                for width in widths:
                                        outfile.write('-'*width + "+")
                                outfile.write('\n')

def getWidths(infilepath, delim):
        answer = defaultdict(int)
        with open(infilepath) as infile:
                for line in infile:
                        cols = line.strip().split(delim)
                        lens = map(len, cols)
                        for i,l in enumerate(lens):
                                if answer[i] < l:
                                        answer[i] = l

        return [answer[k] for k in sorted(answer)]

def main(L, n, infilepath, outfilepath):
    iterator = iter(L)
    with open(infilepath, 'w') as infile:
        for row in itertools.izip_longest([iterator]*n, fillavalue=''):
            infile.write('\t'.join(row)+'\n')
    if len(L) > 10**6:
        largeFile = True
    tabularize(infilepath, outfilepath, delim='\t', largeFile)
2544
задан Damjan Pavlica 13 August 2018 в 10:51
поделиться

11 ответов

Метки времени в MySQL обычно используются для отслеживания изменений в записях и часто обновляются каждый раз, когда запись изменяется. Если Вы хотите сохранить определенное значение, необходимо использовать поле даты и времени.

, Если Вы подразумевали, что хотите решить между использованием метки времени UNIX или собственного поля даты и времени MySQL, пойдите с собственным форматом. Можно сделать вычисления в MySQL тот путь ("SELECT DATE_ADD(my_datetime, INTERVAL 1 DAY)"), и просто изменить формат значения к метке времени UNIX ("SELECT UNIX_TIMESTAMP(my_datetime)") при запросах записи, если Вы хотите воздействовать на него с PHP.

1751
ответ дан doitlikejustin 13 August 2018 в 20:51
поделиться

Я принимаю это решение о семантической основе.

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

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

121
ответ дан MaxVT 13 August 2018 в 20:51
поделиться

МЕТКА ВРЕМЕНИ составляет 4 байта По сравнению с 8 байтами для ДАТЫ И ВРЕМЕНИ.

в http://dev.mysql.com/doc/refman/5.0/en/storage-requirements.html

, Но как scronide было сказано, что он действительно имеет нижний предел 1970 года. Это является большим для чего-либо, что могло бы произойти в будущем хотя ;)

95
ответ дан Alex 13 August 2018 в 20:51
поделиться

Я всегда использовал бы метку времени Unix при работе с MySQL и PHP. Главная причина для этого являющегося значение по умолчанию дата метод в PHP использует метку времени в качестве параметра, таким образом, не было бы никакого необходимого парсинга.

Для получения текущей метки времени Unix в PHP просто сделайте time();
, и в MySQL делают SELECT UNIX_TIMESTAMP();.

22
ответ дан Peter Mortensen 13 August 2018 в 20:51
поделиться
  • 1
    Я просто хочу добавить, что это вообще верно, и что у меня было то же сообщение, которое разрешило тот же путь при использовании Максимумов. – learner 30 January 2014 в 00:20

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

Как упомянул в документации MySQL:

тип ДАТЫ И ВРЕМЕНИ используется при необходимости в значениях, которые содержат обе информации о дате и времени. MySQL получает и отображает значения ДАТЫ И ВРЕМЕНИ в 'YYYY-MM-DD HH:MM:SS' формат. Поддерживаемый диапазон '01.01.1000 0:00:00' к '31.12.9999 23:59:59'.

...

Тип данных timestamp имеет диапазон '01.01.1970 0:00:01' UTC к '09.01.2038 3:14:07' UTC. Это имеет переменные свойства, в зависимости от версии MySQL и режима SQL, в котором работает сервер.

Вы, довольно вероятно, поразите нижний предел в МЕТКИ ВРЕМЕНИ во всеобщем употреблении - например, дата рождения хранения.

489
ответ дан Kip 13 August 2018 в 20:51
поделиться

timestamp поле является особым случаем datetime поле. Можно создать timestamp столбцы, чтобы иметь специальные свойства; это может быть установлено обновить себя на любом, создают и/или обновляют.

В "больших" терминах базы данных, timestamp имеет несколько особых случаев, включает его.

то, Что правильный, зависит полностью от того, что Вы хотите сделать.

36
ответ дан Hafenkranich 13 August 2018 в 20:51
поделиться
  • 1
    Я couldn' t находят его там также, но нашли это в другом месте: " Восстановите Gnuplot-4.4.3, включенный с Октавой 3.4.0 DMG Открытый/Applications/Gnuplot.app/Contents/Resources/bin/gnuplot в текстовом редакторе. Используйте функцию поиска-и-замены редактора для замены " DYLD_LIBRARY_PATH" с " DYLD_FALLBACK_LIBRARY_PATH". существует четыре экземпляра, которые должны быть заменены " [А-ч, я вижу, что это также отправляется ниже с более низким разрядом; I' ll upvote, что один также.] – David P Simons 23 March 2012 в 18:07

Я предпочитаю использовать метку времени так, чтобы сохранить все в одном общем формате .raw и отформатировать данные в коде PHP или в Вашем SQL-запросе. Существуют экземпляры, где это пригождается в Вашем коде для хранения всего в простые секунды.

8
ответ дан Hans 13 August 2018 в 20:51
поделиться

В MySQL 5 и выше, МЕТКА ВРЕМЕНИ значения преобразовываются от зоны текущего времени до UTC для устройства хранения данных и преобразовали назад от UTC до зоны текущего времени для извлечения. (Это происходит только для Типа данных timestamp, и не для других типов, таких как ДАТА И ВРЕМЯ.)

По умолчанию, зона текущего времени для каждого соединения является временем сервера. Часовой пояс может быть установлен на основе для каждого подключения, как описано в MySQL Server Time Zone Support .

884
ответ дан Peter Mortensen 13 August 2018 в 20:51
поделиться
  • 1
    @teabot попробовали еще раз теперь, похож на gfortran формулу, был обновлен... – Pygmalion 9 November 2011 в 08:24

Основное отличие состоит в том, что dateTime постоянна, когда Timestamp влияет на настройку Time_zone .

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

У более простых слов: Если у меня есть база данных в Австралии, и сделайте дамп этой базы данных, чтобы синхронизировать / заполнить базу данных в Америке, то временная метка будет обновляться, чтобы отразить в реальном времени события в новом Часовой пояс, в то время как DateTime все равно будет отражать время события в часовой поясе AU .

Отличный пример использования DateTime, используемый, когда Timestamp должен был использован, находится в Facebook, где их серверы никогда не совсем уверены, во сколько времени произошло через часовые пояса. Как только у меня разговор, в котором говорится, что я отвечал на сообщения до того, как сообщение действительно было отправлено. (Это, конечно, также может быть вызвано плохим переводом часового пояса в программном обеспечении обмена сообщениями, если время размещены, а не синхронизированные.)

187
ответ дан 22 November 2019 в 19:51
поделиться

TIMESTAMP всегда указывается в формате UTC (то есть в секундах, прошедших с 1970-01-01, в формате UTC), и ваш сервер MySQL автоматически преобразует его в дату/время для часового пояса соединения. В долгосрочной перспективе TIMESTAMP — это то, что вам нужно, потому что вы знаете, что ваши временные данные всегда будут в формате UTC. Например, вы не испортите даты, если перейдете на другой сервер или измените настройки часового пояса на своем сервере.

Примечание: часовой пояс соединения по умолчанию — это часовой пояс сервера, но его можно (должно) изменить для каждого сеанса (см. SET time_zone = ... ).

34
ответ дан 22 November 2019 в 19:51
поделиться

DATETIME не содержит информации часового пояса с ним и будет всегда отображать того же независимого политика часового пояса, который является в действительности для сервера. Однако, если я инициализирую DATETIME столбец с функцией такой как NOW(), а не литерал такой как '2020-01-16 12:15:00', тогда сохраненное значение, конечно, будет текущей датой и время, локализованное к часовому поясу сервера.

А TIMESTAMP, в отличие от этого, неявно содержит информацию часового пояса: Когда Вы инициализируете TIMESTAMP столбец со значением, то значение преобразовывается в UTC, прежде чем это будет сохранено. Если сохраненное значение является литералом такой как '2020-01-16 12:15:00', оно интерпретируется как являющийся в текущем часовом поясе сервера в целях преобразования. С другой стороны, когда TIMESTAMP столбец отображен, он будет сначала преобразован от UTC до текущего часового пояса сервера.

, Когда использовать один или другой? Тематическое исследование

Веб-сайт А для группы самодеятельного театра представляет несколько действий игры, за которую он продает билеты. Даты и время этих действий появятся в выпадающем, из которого клиент, желающий купить билеты для производительности, выберет ту. Имело бы смысл для столбца performance_date_and_time базы данных быть DATETIME тип. Если производительность находится в Нью-Йорке, существует понимание, что существует неявный включенный часовой пояс ("нью-йоркское местное время"), и идеально мы хотели бы, чтобы дата и время отобразилась как '12 декабря 2019 в 20:00' независимо от часового пояса сервера и не имея необходимость переходить к проблеме необходимости сделать любые преобразования часового пояса.

, С другой стороны, как только производительность 20:00 12-го декабря 2019 началась, мы больше не могли бы хотеть продавать билеты для нее и таким образом больше не отображать ту производительность в выпадающем. Так, мы хотели бы знать, произошло ли '12.12.2019 20:00:00' или нет. Это привело бы доводы в пользу наличия TIMESTAMP столбец, установка часовой пояс сервера для сессии к 'America/New_York' с [1 111] и затем хранение '2019-12-12 20:00:00' в TIMESTAMP столбец. Впредь мы можем протестировать на то, началась ли производительность путем сравнения этого столбца с [1 114] независимый от текущего часового пояса.

Или могло бы иметь смысл иметь DATETIME и TIMESTAMP столбец в этих двух отдельных целях. Или нет. Очевидно, любой мог служить обеим целям. Если Вы идете только с DATETIME столбец, то необходимо установить текущий часовой пояс на локальный часовой пояс прежде, чем соответствовать [1 118]. Если Вы идете только с TIMESTAMP столбец, необходимо установить текущий часовой пояс на локальный часовой пояс прежде, чем отобразить столбец.

1
ответ дан 22 November 2019 в 19:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: