Archive for MySQL

Расстановка точек над time, date, timestamp

Начнем с того что есть некая метка времени Unix – это 32-разрядное
целое число секунд. Все договорились, что количество секунд от момента 1 января 1970 г. по Гринвичу до того момента времени в котором Вы хотите узнать эту самую метку времени.

Метки времени UNIX — компактный способ хранения даты и времени и стоит от
метить, что на него совершенно не повлияла проблема 2000-го года (Y2K), от которой «пострадали» другие сокращенные форматы хранения даты. Тем не менее, для программного обеспечения в 2038 г. подобная проблема может возникнуть. Хотя метки
времени не имеют фиксированного размера, они «привязаны» к размеру длинного
целого в С (32 бита). Наиболее вероятным решением к 2038 г. будет использование в
компиляторах более емкого типа.

Даже если РНР запускается на Windows-сервере, все равно функция date() и другие
PHP-функции используют именно такой формат хранения даты. Итак…

Как получить метку времени?

1. Функция mktime()

Чтобы преобразовать время и дату в формат метки времени UNIX, можно воспользоваться функцией mktime(), которая имеет следующий прототип:

int mktime (int hour, int minute, int second, int month,int day, int year [, int is_dst])

is_dst указывает, действует ли переход на летнее время. Его можно установить равным 1, если переход на летнее время действует, и 0 — если нет, либо -1 (значение по умолчанию), если это неизвестно. В любом случае, этот аргумент является необязательным и поэтому используется редко.

2. Функция strtotime()

strtotime() преобразует текстовое представление даты на английском языке в метку времени Unix. Функция strtotime() использует GNU формат даты, поэтому рекомендуется ознакомиться с руководством GNU Date Input Formats, где описывается синтаксис аргумента time.

Пример кода

<pre> &lt;?php echo strtotime("now"), "\n"; echo strtotime("10 September 2000"), "\n"; echo strtotime("+1 day"), "\n"; echo strtotime("+1 week"), "\n"; echo strtotime("+1 week 2 days 4 hours 2 seconds"), "\n"; echo strtotime("next Thursday"), "\n"; echo strtotime("last Monday"), "\n"; ?&gt; </pre>

3. SELECT UNIX_TIMESTAMP(`field_date`) AS `field_date` FROM `table`

Этот способ используется при получении метки времени из базы данных MySQL при условии что поле таблицы имеет тип TIMESTAMP

4. time() — Возвращает текущую метку времени

Как получить дату (как строку) из метки времени?

1. string strftime ( string format [, int timestamp] )

  • Возвращает строку, отформатированную в соответствии с аргументом format, используя аргумент timestamp или текущее системное время, если этот аргумент не передан. Названия месяцев, дней недели и другие строки, зависящие от языка, соответствуют текущей локали, установленной функцией setlocale().

    В форматирующей строке распознаются следующие символы:

    %a – сокращенное название дня недели в текущей локали

  • %A – полное название дня недели в текущей локали
  • %b – сокращенное название месяца недели в текущей локали
  • %B – полное название месяца недели в текущей локали
  • %c – предпочтительный формат даты и времени в текущей локали
  • %C – столетие (год, деленный на 100 и огругленный до целого, от 00 до 99)
  • %d – день месяца в виде десятичного числа (от 01 до 31)
  • %D – аналогично %m/%d/%y
  • %e – день месяца в виде десятичного числа, если это одна цифра, то перед ней добавляется пробел (от ‘ 1′ до ’31′)
  • %g – подобно %G, но без столетия.
  • %G – Год, 4-значное число, соответствующее номеру недели по ISO (см. %V). Аналогично %Y, за исключением того, что если номер недели по ISO соответствует предыдущему или следующему году, используется соответствующий год.
  • %h – аналогично %b
  • %H – номер часа от 00 до 23
  • %I – номер часа от 01 до 12
  • %j – номер дня в году (от 001 до 366)
  • %m – номер месяца (от 01 до 12)
  • %M – минуты
  • %n – символ «\n»
  • %p – `am’ или `pm’, или соответствующие строки в текущей локали
  • %r – время в формате a.m. или p.m.
  • %R – время в 24-часовом формате
  • %S – секунды
  • %t – символ табуляции («\t»)
  • %T – текущее время, аналогично %H:%M:%S
  • %u – номер дня недели от 1 до 7, где 1 соответствует понедельнику
  • нимание

    На Sun Solaris 1 соответствует воскресенью, хотя в ISO 9889:1999 (текущий стандарт языка C) явно указано, что это должен быть понедельник.

  • %U – порядковый номер недели в текущем году. Первым днем первой недели в году считается первое воскресенье года.
  • %V – Порядковый номер недели в году по стандарту ISO 8601:1988 от 01 до 53, где 1 соответствует первой неделе в году, в которой как минимум 4 дня принадлежат этому году. Первым днем недели считается понедельник. (Используйте %G or %g для определения соответствующего года)
  • %W – порядковый номер недели в текущем году. Первым днем первой недели в году считается первый понедельник года.
  • %w – номер дня недели, 0 соответствует воскресенью
  • %x – предпочтительный формат даты без времени в текущей локали
  • %X – предпочтительный формат времени без даты в текущей локали
  • %y – год без столетия (от 00 до 99)
  • %Y – год, включая столетие
  • %Z – временная зона в виде смещения, аббривеатуры или полного наименования
  • %% – символ `%’
  • Пример 1. Пример использования функции strftime() с разными локалями

    <pre> &lt;?php setlocale(LC_TIME, "C"); echo strftime("%A"); setlocale(LC_TIME, "fi_FI"); echo strftime(" по-фински - %A,"); setlocale(LC_TIME, "fr_FR"); echo strftime(" по-французски - %A и"); setlocale(LC_TIME, "de_DE"); echo strftime(" по-немецки - %A.\n"); setlocale(LC_TIME, 'ru_RU.CP1251'); echo strftime(" %A %d %B, %Y в %H:%M"); ?&gt; </pre>

    Как получить дату для записи в поля типа «timestamp», «DATE», «TIME», «TIMEDATE» таблицы MySQL

    date(«Y-m-d»);
    date(«H:i:s»);
    date(«Y-m-d H:i:s»);

Удаление дубликатов в Mysql

Недавно столкнулся с задачей удаления дубликатов сток в таблице. Нашел элегантное решение в сети, а именно запрос с JOIN таблиц самой на себя:

DELETE t1 FROM sys_users t1, sys_users t2 WHERE t1.login=t2.login AND t1.ID > t2.ID

Найти дубликаты не удаляя их можно так:

SELECT login, COUNT(login) AS cnt FROM users GROUP BY login HAVING ( COUNT(login) > 1 )