2013-12-10 2 views
-1

Хорошо у меня есть сценарий (это разбивается)дата между не работает, если дата охватывает несколько лет

$monday = date('m/d/y',strtotime('this week monday')); 
$this_monday = date('y-m-d',strtotime('this week monday')); 
$tuesday = date('m/d/y',strtotime('this week tuesday')); 
$this_tuesday = date('y-m-d',strtotime('this week tuesday')); 
$wednesday = date('m/d/y',strtotime('this week wednesday')); 
$this_wednesday = date('y-m-d',strtotime('this week wednesday')); 
$thursday = date('m/d/y',strtotime('this week thursday')); 
$this_thursday = date('y-m-d',strtotime('this week thursday')); 
$friday = date('m/d/y',strtotime('this week friday')); 
$this_friday = date('y-m-d',strtotime('this week friday')); 
$saturday = date('m/d/y',strtotime('this week saturday')); 
$this_saturday = date('y-m-d',strtotime('this week saturday')); 
$sunday = date('m/d/y',strtotime('this week sunday')); 
$this_sunday = date('y-m-d',strtotime('this week sunday')); 

$fourth_monday = date('m/d/y',strtotime($this_monday.'+21 days')); 
$fourth_tuesday = date('m/d/y',strtotime($this_tuesday.'+21 days')); 
$fourth_wednesday = date('m/d/y',strtotime($this_wednesday.'+21 days')); 
$fourth_thursday = date('m/d/y',strtotime($this_thursday.'+21 days')); 
$fourth_friday = date('m/d/y',strtotime($this_friday.'+21 days')); 
$fourth_saturday = date('m/d/y',strtotime($this_saturday.'+21 days')); 
$fourth_sunday = date('m/d/y',strtotime($this_sunday.'+21 days')); 


$fourthSchedule = DB::getInstance()->getAssoc("SELECT * FROM sched WHERE full_name = ? AND date between ? and ?", array(
     $tech, $fourth_monday, $fourth_sunday)); 
    foreach($fourthSchedule->results() as $results) { 
     $sched_rows_4[$tech][] = $results; 
    } 

Это прекрасно работает, если он остается в текущем году. Проблема в том, что если на этой неделе (как и в этом году), она пройдет с конца декабря до начала января, она не вернет результаты.

Любое понимание было бы полезно оценить, как исправить эту проблему.

+1

Ваш 'date' поле в базе данных' date' типа? –

+0

Это не его varchar – nickmc01

ответ

0

От вашего ответа на мое замечание, ответ тогда легко:

В алфавитном порядке, 01-01-2014 предшествует 12-31-2013, так ваши результаты сравнения (between, < или >) всегда будут довольно неустойчивыми. Это кажется более очевидным при переходе от года к году, но может произойти и в том же году в зависимости от вашего текущего формата даты ... (здесь, в Бельгии, стандарт dd-mm-yyyy, поэтому 15-12-2013 придет до 21-01 -2013, например ...)

EDIT (добавлены детали из замечания):

лучшее решение было бы использовать поле даты типа. Если вы действительно хотите использовать varchar, используйте формат даты, в котором соблюдается алфавитный порядок: yyyy-mm-dd

В обоих случаях вам нужно будет запустить запрос для обновления существующих данных. Чтобы преобразовать в формат DateTime, создайте поле DataTime и обновите его, выставив значение из текущего поля varchar. Если вы сохраните тип varchar, просто обновите поле, используя строковые манипуляции, чтобы при необходимости заказывать значения даты.

Не забудьте сделать резервную копию, прежде чем манипулировать ничего конечно :-)

+0

Хорошо, что прямо сейчас у меня есть около 100 000 записей с использованием текущего формата даты. Есть ли способ поддерживать этот формат, но по-прежнему использовать алфавитный порядок, как вы упомянули? – nickmc01

+0

Просто преобразуйте поле в поле даты и времени (действительно, лучшая идея, зачем хранить даты в varchar?) Или преобразовать данные в соответствии с форматом 'yyyymmdd'. Последней альтернативой может быть выполнение кастинга в каждом запросе, но это будет намного медленнее, поэтому вы действительно не хотите этого делать. –

0

Это может ПОЛЕЗНЫЕ

<?php 

//this is current day 
$from_here_to = strtotime(date('Y-m-d')); 

$monday = date('m/d/y',strtotime('this week monday', $from_here_to)); 

echo $monday.'<br/>'; 

//change your year 
$from_here_to = strtotime('2012-12-10'); 

$monday = date('m/d/y',strtotime('this week monday', $from_here_to)); 

echo $monday; 
+0

Если вы меняете год года все это работает – Sundar

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