PDA

Просмотр полной версии : [Вопрос] Дата вступления MySQL.



Skyline
25.08.2016, 03:08
Здравствуйте. Подскажите пожалуйста, как в БД обозначить дату вступления и дату повышения игрока.
При назначении лидерки и вступления игрока я добавил:

PlayerInfo[params[0]][pDataInvite] = gettime();
А какой тип указать в БД? Полазил по интернету, прочитал что DATETIME выводит дату и время, как раз то, что мне нужно. Попробовал, но когда я назначил лидерку, ничего не произошло, в БД запись не обновилась, а осталась 0000-00-00 00:00:00
Если выбираю INT - то выводит просто целое огромное число.
Подскажите как быть и как это вывести потом в игре, через format например.

$continue$
25.08.2016, 03:28
gettime() возвращает UNIX Time (https://ru.wikipedia.org/wiki/UNIX-%D0%B2%D1%80%D0%B5%D0%BC%D1%8F)
Пример с WIKI:


new Hour, Minute, Second, Timestamp;
Timestamp = gettime(Hour, Minute, Second);
printf("%02d:%02d:%02d", Hour, Minute, Second);
printf("Seconds since midnight 1st January 1970: %d", Timestamp);



Советую использовать функцию NOW() (https://htmlweb.ru/php/mysql_date_time.php) и тогда тип столбца - DATETIME.

Skyline
25.08.2016, 03:33
Т.е. если я использую NOW() он запишет один раз, без изменений, т.е если игрока приняли, записалась дата и все, а если потом повысили, то она уже не перезапишется?
И как тогда вывести мой PlayerInfo[params[0]][pDataInvite] через NOW? Подскажи пожалуйста.

$continue$
25.08.2016, 03:36
Не совсем понял, но почему дата принятия перезаписывается в зависимости от повышения игрока?

Т.е. если я использую NOW() он запишет один раз, без изменений, т.е если игрока приняли, записалась дата и все, а если потом повысили, то она уже не перезапишется?
Зачем это нужно? И как оно используется?

И как тогда вывести мой PlayerInfo[params[0]][pDataInvite] через NOW? Подскажи пожалуйста.

wAx
25.08.2016, 03:38
Значение из поля datetime, если не ошибаюсь, выводится как строка. Пр. Повышении игрока просто в то же поле еще раз запиши данные по такому же принципу, время обновится

Skyline
25.08.2016, 03:40
Не совсем понял, но почему дата принятия перезаписывается в зависимости от повышения игрока?

Зачем это нужно? И как оно используется?

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

А DataInvite хочу чтобы хранило в себе эту дату принятия, чтобы можно например было вывести в статистике игрока.
Или же можно как то сделать иначе?

DeimoS
25.08.2016, 10:10
Ну так какие проблемы? При вступлении во фракцию отправляй запрос с использованием NOW() на нужный столбец. Когда нужно выгрузить, выгружай как строку (соответственно, в массив). Когда нужно обнулить - обнуляй. Когда нужно обновить - обновляй. Всё работает точно так же, как и с другими столбцами. Для дат нет каких-то особенных условий, кроме определённого типа столбца в БД (о чём уже сказали) и, собственно, всё.
С повышением всё точно так же.

Или ты хочешь, чтоб мы тебе тут готовые запросы написали и рассказали куда их вставлять?

_lizard
25.08.2016, 11:18
Если я не ошибаюсь, функция NOW () в плагине от Blue-G всегда возвращает нулевые значения

ziggi
25.08.2016, 11:51
Если я не ошибаюсь, функция NOW () в плагине от Blue-G всегда возвращает нулевые значения

NOW() - это не функция плагина, это функция сервера. Если возвращается нулевое значение, то ваш MySQL сервер настроен неправильно. Гораздо надёжнее будет воспользоваться функцией SA-MP - gettime() и передать полученное значение в MySQL.

Skyline
25.08.2016, 12:14
NOW() - это не функция плагина, это функция сервера. Если возвращается нулевое значение, то ваш MySQL сервер настроен неправильно. Гораздо надёжнее будет воспользоваться функцией SA-MP - gettime() и передать полученное значение в MySQL.

Тогда тип DataInvite в БД будет INT? Просто он записывает не дату, а целое число.

_lizard
25.08.2016, 13:52
Тогда тип DataInvite в БД будет INT? Просто он записывает не дату, а целое число.

DATE/TIME/DATETIME

Skyline
25.08.2016, 15:17
DATE/TIME/DATETIME

Он не обновляется, просто выводит 0000-00-00 00:00:00

_lizard
25.08.2016, 15:33
Он не обновляется, просто выводит 0000-00-00 00:00:00


Если возвращается нулевое значение, то ваш MySQL сервер настроен неправильно. Гораздо надёжнее будет воспользоваться функцией SA-MP - gettime() и передать полученное значение в MySQL.

У тебя localhost?

Skyline
25.08.2016, 17:36
Да, локалка.

- - - Добавлено - - -

Разобрался. Сделал такого плана через include mxdate

new string[50];
format(string, sizeof(string),"Дата вступления %s",date("%dd.%mm.%yyyy %hh:%ii:%ss",PlayerInfo[playerid][pInvited]));
ShowPlayerDialog(playerid, 100, DIALOG_STYLE_MSGBOX, "Дата вступления", string,"Ок","");

TheMallard
26.08.2016, 03:54
Нельзя использовать mxDate, воспользуйся (https://github.com/Open-GTO/time_t)

Skyline
26.08.2016, 11:32
Нельзя использовать mxDate, воспользуйся (https://github.com/Open-GTO/time_t)

Почему нельзя?

123
26.08.2016, 13:48
Почему нельзя?

Он ошибочно определяет время. Да и он возвращает строку, что крайне нежелательно.

Роуди.
26.08.2016, 13:59
А я хранил всегда UNIX время в int. Это диагноз?

Skyline
27.08.2016, 06:03
Он ошибочно определяет время. Да и он возвращает строку, что крайне нежелательно.

Настроил gettime что показывает все точно)

123
27.08.2016, 07:16
Настроил gettime что показывает все точно)

Хочешь использовать багованный конвертер - используй, тут до этого нет никому дела. Тебя всего лишь посоветовали действительно рабочий конвертер, и предупредили о давно известном факте (заметь, именно факте, о ошибках в mxDate всем давно известно). И что можно настроить в gettime? В нем нет нареканий, а ты лепишь некому непонятные костыли, когда можно делать все по уму.

Skyline
28.08.2016, 05:14
Хочешь использовать багованный конвертер - используй, тут до этого нет никому дела. Тебя всего лишь посоветовали действительно рабочий конвертер, и предупредили о давно известном факте (заметь, именно факте, о ошибках в mxDate всем давно известно). И что можно настроить в gettime? В нем нет нареканий, а ты лепишь некому непонятные костыли, когда можно делать все по уму.

Я просто с этим не очень разобрался.

new year, month, day, hour, minute, second;
gmtime(gettime(), year, month, day, hour, minute, second);
И как вывести это в переменную pDataInvite? Чтобы сохраняло и показывало через format?

123
28.08.2016, 06:40
Я просто с этим не очень разобрался.

new year, month, day, hour, minute, second;
gmtime(gettime(), year, month, day, hour, minute, second);
И как вывести это в переменную pDataInvite? Чтобы сохраняло и показывало через format?

Там дан конкретный пример.


new string[50], year, month, day, hour, minute, second;
gmtime(PlayerInfo[playerid][pInvited], year, month, day, hour, minute, second);

format(string, sizeof(string),"Дата вступления %02d:%02d:%02d %02d.%02d.%04d",
hour, minute, second, day, month, year);
ShowPlayerDialog(playerid, 100, DIALOG_STYLE_MSGBOX, "Дата вступления", string,"Ок","");

Это переделанный пример, который ты кидал выше. И время тут возвращается по GMT, если нужно - плюсани свой часовой пояс в часы.