Фильтрация поля где хранится дата в формате timestamp()

fixxxer

К.О.
Партнер клуба
А потом оказывается что появляется TZ :)
Или интересные моменты связанные с невалидной датой. Сначала база была на сервере с одной TZ а потом после переезда стала на другой.
Т.е. когда девопсы и разработчики понимают что они делают, то вообще пофигу в чем хранить, но обычно как раз наоборот :)
Поэтому в стандарте sql есть datetime/timestamp with time zone. Но у mysql как всегда свой путь)
 

StalkerClasses

Новичок
ооо, если как Int - значит именно int в unixtimestamp. потому что у мускуля есть тип данных timestamp тоже.
Но тогда вопрос - в какой часовом поясе надо все выбирать?
А часовой пояс здесь не причем полагаю.
Если новость из кремля была опубликована в России, то люди в германии должны утрудится сверить часовые пояся и искать новость по Российскому часовому поясу...
 

Yoskaldyr

"Спамер"
Партнер клуба
А вообще тебе надо разобраться с преобразованием даты из текста в числовой формат учитывая таймзону и исходя из этого делать условия для запроса. Что именно тут тебе никто не подскажет, т.к. никто не поймет твоей фантазии что ты в итоге хочешь получить

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

StalkerClasses

Новичок
Я создал кастомный "CustomEloquentBuilder"
И не могу понять
PHP:
class CustomEloquentBuilder extends Builder
{

    public function whereDay($column, $operator, $value = null)
    {
    print 123; // -> Эта функция переопределяется и результат есть, когда я ее запрашиваю в SELECT-запросах
    exit();
    }
   
        /**
     * Add a date based (year, month, day, time) statement to the query.
     *
     * @param  string  $type
     * @param  string  $column
     * @param  string  $operator
     * @param  mixed  $value
     * @param  string  $boolean
     * @return $this
     */
    protected function addDateBasedWhere($type, $column, $operator, $value, $boolean = 'and')
    {
    print 12321; // -> сюда не попадаю...
        exit(); // -> Но вот эта функцию "addDateBasedWhere" почему-то все равно использует родительский "addDateBasedWhere"
    }
 

StalkerClasses

Новичок
Это кто так решил?
Полагаю когда нужно учитывать временную зону для выборки SELECT-запросов это уже какая-то другая логика. Почему я показывая сайт в другом регионе россии должен корректировать часовой пояс?
 

fixxxer

К.О.
Партнер клуба
Когда я писал насчет таймстампов я имел ввиду хранение даты/времени в unix тайме (т.е. int). Но у тебя похоже именно timestamp тип.
Если честно стараюсь избегать как timestamp так и datetime поля в базе. Особенно если нужно несколько часовых поясов и т.д.
Преобразования времени пусть лучше происходят в одном месте, только на уровне пхп, а не в 2-х и пхп и база.
Но это имхо.
Юникс-таймстемп не всегда поможет. Допустим, надо запланировать событие, которое произойдёт в будущем в определенную дату и время по конкретному часовому поясу. С Новым годом поздравить, например. Если в промежутке между записью в базу и временем самого события tzdata для часового пояса изменится, все сломается.
 

StalkerClasses

Новичок
Юникс-таймстемп не всегда поможет. Допустим, надо запланировать событие, которое произойдёт в будущем в определенную дату и время по конкретному часовому поясу. С Новым годом поздравить, например. Если в промежутке между записью в базу и временем самого события tzdata для часового пояса изменится, все сломается.
Да когда с НГ поздравить часовой пояс надо учитывать...
 

Yoskaldyr

"Спамер"
Партнер клуба
Если в промежутке между записью в базу и временем самого события tzdata для часового пояса изменится, все сломается.
Да оно все равно сломается если попадет на несуществующее время, например на пробел в переводе летнего/зимнего времени :)
А вообще календари и интервалы этих календарей это отдельная интересная задачка с кучей граничных условий и нюансов, где по определению будут баги в этих граничных случаях
 

Yoskaldyr

"Спамер"
Партнер клуба
Дата пишется БЕЗ TZ.
datetime почти пофиг на TZ, timestamp - нет
но не стоит забывать что для datetime есть невозможное время и по умолчанию последние версии мускуля не дадут эти невозможные даты записать. А дата то будет валидна для одного пояса и невалидна для другого (перевод часов летнее/зимнее). Это почти всегда забывают разработчики любящие использовать datetime для всего что ни попадя.
Аналогично перевод времени затрагивает когда важен строгий порядок сортировки, например по дате создания. Но как сортировать если одно и тоже время может повторяется 2 раза (тоже перевод времени)

Потому я и написал, что разработчик должен понимать что использовать и какие косяки от каждого решения. Но это совсем не о ТС.
 

AnrDaemon

Продвинутый новичок
Да оно все равно сломается если попадет на несуществующее время, например на пробел в переводе летнего/зимнего времени
Если такое изменение в TZ произойдёт после записи в базу, это проблема программы.
Поскольку мы уже решили, что конвертация происходит в одном месте.
Кстати, попробуй сделать
PHP:
<?=DateTime::createFromFormat("Y-m-d", "2021-03-43")->format("Y-m-d");
 
Сверху