2016-01-09 6 views
0

Я использую базу данных MySQL в производстве и базу данных SQLite для запуска тестов. Одна часть моей заявки используется для сбора ежемесячной статистики за год. Я успешно сделал это, однако он пришел по цене не в состоянии автоматизировать тесты, потому что я использую MySQL определенные функции при запросе данных:Извлечение деталей даты с использованием DBIC при сохранении запросов агностик запросов

my $criteria = { 
    status => ['Complete'], 
    'YEAR(completed_on)' => DateTime->now()->year(), 
}; 

my $attributes = { 
    select => [ { count => 'title' }, 'completed_on' ], 
    as => [qw/num_completed datetime/], 
    group_by => [qw/MONTH(completed_on)/], 
}; 

Примечание Я использую YEAR и MONTH MySQL функции.

Я знаю один способ, которым я могу заменить, где положение, чтобы исключить использование MySQLs YEAR функции, что-то вроде этого:

my $dtf = $schema->storage->datetime_parser; 
my $begin_date = DateTime->from_day_of_year(year => DateTime->now()->year(), day_of_year => 1); #inception o_O 
my $end_date = DateTime->from_day_of_year(year => DateTime->now()->year(), day_of_year => 36[56]); 

my $criteria = { 
    status => ['Complete'], 
    completed_on => 
    -between => [ 
     $dtf->format_datetime($begin_date), 
     $dtf->format_datetime($end_date), 
    ] 
}; 

Using the recommended way to query date fields using DBIC

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

Спасибо!

+0

Я не думаю, нет способа сделать это? – a7omiton

ответ

1

Иногда вам нужно будет указать код двигателя в DBIx :: Class, если вы пытаетесь сделать что-то особенное. Вы можете использовать $schema->storage->sqlt_type для создания разных SQL.

Примечание: вы также можете использовать substr(completed_on,1,4), чтобы получить год в SQLite.

Это позволит решить вашу проблему:

my $type = $schema->storage->sqlt_type; 

my $criteria; 
my $attributes; 

if ($type eq 'MySQL') { 
    $criteria = { 
     status => ['Complete'], 
     'YEAR(completed_on)' => DateTime->now()->year(), 
    }; 

    $attributes = { 
     select => [ { count => 'title' }, 'completed_on' ], 
     as => [qw/num_completed datetime/], 
     group_by => [qw/MONTH(completed_on)/], 
    }; 
} 
elsif ($type eq 'SQLite') { 
    my $dtf = $schema->storage->datetime_parser; 
    my $begin_date = DateTime->from_day_of_year(year => DateTime->now()->year(), day_of_year => 1); #inception o_O 
    my $end_date = DateTime->from_day_of_year(year => DateTime->now()->year() + 1, day_of_year => 1)->add(seconds => -1); 

    $criteria = { 
     status => ['Complete'], 
     completed_on => { 
      -between => [ 
       $dtf->format_datetime($begin_date), 
       $dtf->format_datetime($end_date), 
      ] 
     } 
    }; 

    $attributes = { 
     select => [ { count => 'title' }, 'completed_on' ], 
     as => [qw/num_completed datetime/], 
     group_by => ['substr(completed_on,6,2)'], 
    }; 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^