Работа с датами в формате Unix

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
Hoting
Сообщения: 56
Зарегистрирован: 2017.11.10, 10:49

Работа с датами в формате Unix

Сообщение Hoting »

Привет друзья, неожиданно для себя столкнулся с проблемой, в общем да же не думал что это станет проблемой. Суть вопроса в том, что необходимо сделать выборку значений по месяцу или году и произвести суммирование колонки price. Т.е. мы получим сумму заказов по месяцу или году. В стандартном варианте при хранении даты в MySql в формате Date все решается простым запросом

Код: Выделить всё

SELECT SUM(price) AS `price` FROM `zakaz` WHERE MONTH(data_out) = ? AND YEAR(data_out) = ?
но так как мы храним данные в Unix (число Int) такой фокус у меня не проходит, пробую делать так

Код: Выделить всё

$summyear = \app\models\Zakaz::find()->where('YEAR(date_out) = :stryear', [':stryear' => $strdate])->sum('price');
ничего ...
месяц и год передается как чесло, полагаю что нужно делать преобразование даты и в голове есть варианты и переборы, но не ужели нет стандартных простых средств решения такой задачи методами Yii2?
Кто и как решает подобные задачи?
pavlm
Сообщения: 84
Зарегистрирован: 2013.09.02, 16:33

Re: Работа с датами в формате Unix

Сообщение pavlm »

Штатных средств не знаю. Из unixtime можно преобразовать через

Код: Выделить всё

YEAR(FROM_UNIXTIME(data_out))
Скорее всего также понадобится преобразование в нужную тайм-зону, это можно посмотреть здесь: https://github.com/pavlm/yii2-stats-wid ... r.php#L172
andku83
Сообщения: 988
Зарегистрирован: 2016.07.01, 10:24
Откуда: Харьков

Re: Работа с датами в формате Unix

Сообщение andku83 »

или

Код: Выделить всё

FROM_UNIXTIME(data_out, '%Y')
skynin
Сообщения: 400
Зарегистрирован: 2017.12.12, 10:09

Re: Работа с датами в формате Unix

Сообщение skynin »

Hoting писал(а): 2018.06.19, 19:19 но неужели нет стандартных простых средств решения такой задачи методами Yii2?
а зачем? ну то есть сейчас то нет особого смысла хранить даты в int.

еще и потому, что придется мучиться с выборками значений по месяцу или году и произвести суммирование колонки price.
Hoting писал(а): 2018.06.19, 19:19 Кто и как решает подобные задачи?
свое дописывать придется.

а именно, чтобы получить UNIX int для выборки скажем за апрель 2018
beginA - int для 1го апреля 2018 00:00
endA - int для 30го апреля 2018 23:59

тогда
\app\models\Zakaz::find()->where(['>=','date_out',$beginA])->andWhere(['<=','date_out',$endA])->sum('price');

а чтобы не писать каждый раз расчет, конечно добавить в ZakazQuery методы которые высчитывают сами
чтобы
\app\models\Zakaz::find()->whereYearMonth($year, $month)->sum('price');
Не желайте странного, и не будет у вас головной боли чтобы достичь этого странного.
Тем более что окажется что оно вам и не нужно было, странное это.
Hoting
Сообщения: 56
Зарегистрирован: 2017.11.10, 10:49

Re: Работа с датами в формате Unix

Сообщение Hoting »

skynin писал(а): 2018.06.19, 20:26
Hoting писал(а): 2018.06.19, 19:19 но неужели нет стандартных простых средств решения такой задачи методами Yii2?
а зачем? ну то есть сейчас то нет особого смысла хранить даты в int.

еще и потому, что придется мучиться с выборками значений по месяцу или году и произвести суммирование колонки price.
Hoting писал(а): 2018.06.19, 19:19 Кто и как решает подобные задачи?
свое дописывать придется.

а именно, чтобы получить UNIX int для выборки скажем за апрель 2018
beginA - int для 1го апреля 2018 00:00
endA - int для 30го апреля 2018 23:59

тогда
\app\models\Zakaz::find()->where(['>=','date_out',$beginA])->andWhere(['<=','date_out',$endA])->sum('price');

а чтобы не писать каждый раз расчет, конечно добавить в ZakazQuery методы которые высчитывают сами
чтобы
\app\models\Zakaz::find()->whereYearMonth($year, $month)->sum('price');
Если честно, я думал что yii2 достаточно гибок чтоб работать с датами в unix, , большенство скриптов и расширений (которыя я смотрел) использует unix формат, я и думал что это стандарт, в своих проектах (рукописных) я использовал всегда формат Date и выборки делал при помощи MySQL.
При написании собственного скриптика определения даты, вопрос, а как понять когда конец месяца? ведь месяц может закончится в диапазоне от 28 до 31 числа ...
Hoting
Сообщения: 56
Зарегистрирован: 2017.11.10, 10:49

Re: Работа с датами в формате Unix

Сообщение Hoting »

pavlm писал(а): 2018.06.19, 20:15 Штатных средств не знаю. Из unixtime можно преобразовать через

Код: Выделить всё

YEAR(FROM_UNIXTIME(data_out))
Скорее всего также понадобится преобразование в нужную тайм-зону, это можно посмотреть здесь: https://github.com/pavlm/yii2-stats-wid ... r.php#L172
Я правильно понимаю, это в запросе MySQL можно указать?
skynin
Сообщения: 400
Зарегистрирован: 2017.12.12, 10:09

Re: Работа с датами в формате Unix

Сообщение skynin »

Hoting писал(а): 2018.06.20, 11:12 Если честно, я думал что yii2 достаточно гибок чтоб работать с датами в unix,
да как бы это все есть в штатной библиотеке php, какой смысл дублировать это в фреймворке.
Hoting писал(а): 2018.06.20, 11:12 большенство скриптов и расширений (которыя я смотрел) использует unix формат, я и думал что это стандарт
не, не стандарт. просто компактный способ записи дат. а не все базы одинаково поддерживают Timestamp поля. или вообще не поддерживали. поэтому и принималось такое решение. сейчас, иногда имеет смысл, но в целом - незачем. лишние сложности.
причем, в проектах в int нередко хранится вовсе не время UTC, а локальное. соответственно все равно нужно преобразовывать, скажем для сравнения с тем что выдаст time()
Hoting писал(а): 2018.06.20, 11:12 При написании собственного скриптика определения даты, вопрос, а как понять когда конец месяца? ведь месяц может закончится в диапазоне от 28 до 31 числа ...
штатной библиотекой php

how-to-find-the-last-day-of-the-month-from-date
Не желайте странного, и не будет у вас головной боли чтобы достичь этого странного.
Тем более что окажется что оно вам и не нужно было, странное это.
pavlm
Сообщения: 84
Зарегистрирован: 2013.09.02, 16:33

Re: Работа с датами в формате Unix

Сообщение pavlm »

Hoting писал(а): 2018.06.20, 11:14
pavlm писал(а): 2018.06.19, 20:15 Штатных средств не знаю. Из unixtime можно преобразовать через

Код: Выделить всё

YEAR(FROM_UNIXTIME(data_out))
Скорее всего также понадобится преобразование в нужную тайм-зону, это можно посмотреть здесь: https://github.com/pavlm/yii2-stats-wid ... r.php#L172
Я правильно понимаю, это в запросе MySQL можно указать?
верно.
Hoting
Сообщения: 56
Зарегистрирован: 2017.11.10, 10:49

Re: Работа с датами в формате Unix

Сообщение Hoting »

pavlm писал(а): 2018.06.20, 12:19
Hoting писал(а): 2018.06.20, 11:14
pavlm писал(а): 2018.06.19, 20:15 Штатных средств не знаю. Из unixtime можно преобразовать через

Код: Выделить всё

YEAR(FROM_UNIXTIME(data_out))
Скорее всего также понадобится преобразование в нужную тайм-зону, это можно посмотреть здесь: https://github.com/pavlm/yii2-stats-wid ... r.php#L172
Я правильно понимаю, это в запросе MySQL можно указать?
верно.
Все получилось, разобрался.
Спасибо за советы :)
Ответить