WedX - журнал о программировании и компьютерных науках

Doctrine, symfony2 правильный тип столбца для расчета часов

Я записываю рабочие часы и минуты людей, а затем складываю их вместе, чтобы получить общую сумму, отработанную за определенный период. Какой тип столбца лучше всего использовать для этого в Doctrine? Моя первоначальная мысль заключалась в том, чтобы использовать целое число, но это потребует обратного и обратного преобразования в форматы времени.

Какова наилучшая практика для таких расчетов времени?


Ответы:


1

Я бы рекомендовал либо хранить как целое число минут, либо как пользовательское поле «время», которое автоматически создавало бы объект значения «Время», который давал бы вам доступ к нужным вам методам. Объект значения будет немного сложнее.

Преимущество хранения в виде минут заключается в том, что вы можете выполнять поиск, связанный с математикой (SUM, AVG и т. д.), напрямую, вместо того, чтобы вызывать каждый объект по отдельности и добавлять их таким образом.

Помимо использования целочисленного метода, вы можете создать тот же объект значения «Время», который занял время в минутах, а затем получить его из вашего объекта, например..

/**
 * Get minutes worked
 *
 * @return integer
 */
public function getMinutes()
{
    return $minutes;
}

/**
 * Set working minutes
 *
 * @param integer $minutes
 * @return $this
 */
public functions setMinutes($minutes)
{
    $this->minutes = $minutes

    return $this;
}

/**
 * Get worked Time
 *
 * @return Time
 */
public function getTime()
{
    if (null === $this->minutes) {
        return $minutes;
        // Or return Time::fromMinutes(0);
    }

    return Time::fromMinutes($this->minutes);
}

И затем в вашем объекте значения..

class Time
{
    private $minutes;

    /**
     * Private constructor so as to use more meaningful static calls
     *
     * @param integer $minutes
     */
    private function __construct($minutes)
    {
        if ($is_int($minutes)) {
            throw new \Exception(sprintf(
                'Minutes expected to be an "integer", "%s" given',
                gettype($minutes)
            ));
        }

        $this->minutes = $minutes;
    }

    /**
     * Construct object from minutes
     *
     * @param integer $minutes
     * @return Time
     */
    public static function fromMinutes($minutes)
    {
        return self($minutes);
    }

    /**
     * Get time in minutes
     *
     * @return integer
     */
    public function getMinutes()
    {
        return $this->minutes;
    }

    /**
     * Get time in hours and minutes string in 00:00 format
     *
     * @return string
     */
    public function getAsString()
    {
        return sprintf(
            '%02d:%02d',
            floor($this->minutes / 60),
            $this->minutes % 60
        );
    }

    //...
    Any other methods
}

Таким образом, ваша форма может просто принимать минуты (или строку 00:00 с преобразователем данных), а затем вы можете вызвать ее как $job->getTime()->getAsString() (после проверки времени не равно нулю или, альтернативно, возвращая пустой объект Time).

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

  • 2

    Я думаю, что для вашего случая нужно использовать поле типа "datetime". Вы можете конвертировать объект DateTime в разные форматы

        /**
     * @var \DateTime $start
     *
     * @ORM\Column(type="datetime")
     */
    protected $start;
    
    /**
     * @var \DateTime $end
     *
     * @ORM\Column(type="datetime")
     */
    protected $end;
    
    /**
     * @return \DateTime
     */
    public function getStart()
    {
        return $this->start;
    }
    
    /**
     * @param \DateTime $start
     */
    public function setStart(\DateTime $start)
    {
        $this->start = $start;
    }
    
    /**
     * @return \DateTime
     */
    public function getEnd()
    {
        return $this->end;
    }
    
    /**
     * @param \DateTime $end
     */
    public function setEnd(\DateTime $end)
    {
        $this->end = $end;
    }
    
    29.07.2015
  • Спасибо, хотя вместо того, чтобы пользователь выбирал диапазон времени, он просто вручную вводил отработанные часы и минуты. поэтому пользовательский ввод будет примерно 4:30 в течение 4 часов и 30 минут. 29.07.2015
  • Вычислить часы/минуты/секунды легко, если у вас есть DateTime, потому что вы можете вычесть метки времени: ($date->getTimestamp() - $date2->getTimestamp()) / 60. 29.07.2015
  • Новые материалы

    Объяснение документов 02: BERT
    BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

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

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

    Учебные заметки: создание моего первого пакета Node.js
    Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

    Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
    Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..


    Для любых предложений по сайту: [email protected]