PHP или SQL рассчитывают за 3 рабочих дня до даты - PullRequest
1 голос
/ 09 декабря 2010

Я использую Doctrine для ORM моего приложения.В таблице у меня есть 'start_date'.

В php я могу рассчитать за 3 дня до даты:

date('l jS F (Y-m-d)', strtotime('-3 days'));

Но это касается выходных, я хотел бы включить только рабочие дни.

Т.е. если бы событие было в среду, я бы получил напоминание по электронной почте в воскресенье.Я бы предпочел получать электронное письмо с напоминанием в пятницу.Итак, как бы я рассчитал использовать только Mon-Fri для расчета?

Если вы знаете, как сделать это и в Oracle, это было бы здорово.

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

Спасибо, ребята.

Ответы [ 3 ]

5 голосов
/ 09 декабря 2010

PHP 5.3 поддерживает относительные даты, такие как дни недели , например,

echo date('Y-m-d', strtotime('-3 weekdays', strtotime('2010-12-08')));

будет производить 2010-12-03 (пятница) вместо

echo date('Y-m-d', strtotime('-3 days', strtotime('2010-12-08')));

, который будет производить 2010-12-05 (воскресенье)

Любые форматы, поддерживаемые strtotime, также поддерживаются в DateTime API .

Афаик, для выполнения этого вычисления из Oracle требуется некоторая гимнастика

1 голос
/ 09 декабря 2010

В Oracle, чтобы получить день недели (1-7), используйте следующее

select to_char(sysdate, 'D')
from dual

, что упрощает исключение суббот и воскресений.

Точное определениеоднако «рабочих дней», вероятно, будет значительно отличаться от места к месту (и от предприятия к бизнесу), поэтому в этом случае я бы предложил таблицу базы данных для хранения конкретных рабочих дат (как фактических дат).

1 голос
/ 09 декабря 2010

дата ('w') дает числовое представление дня недели. От 0 (воскресенье) до 6 (суббота) вы можете просто проверить, является ли ваша дата 0 или 6, а затем вычесть 2 (или один) дополнительных дня.

$n = 3
$timestamp = strtotime("-$n days")
$day = date('w', $timestamp);
if ($day == 0) {
    $n = $n - 2;
} else if ($day == 6) {
    $n = $n - 1;
}

$timestamp = strtotime("-$n days")

$dateString = date('l jS F (Y-m-d)', $timestamp);

Извините, я не знаю ни одного конкретного кода для оракула. ​​

...