2010-12-09 161 views
1

我使用Doctrine作爲我的應用程序的ORM。在表格中,我有一個'start_date'。PHP或SQL在某個日期前3個工作日計算

在PHP中,我可以在日期之前計算三日遊:

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

但這個週末包括,我想只包括工作日。

I.e.如果週三有活動​​,我會在週日收到提醒郵件。我寧願在週五取得提醒電子郵件。那麼我怎麼計算才能使用週一至週五進行計算?

如果你知道如何在Oracle中做到這一點,那就太棒了。

我更喜歡在PHP中使用它,所以我不必使用自定義的oracle函數(如果我希望更改數據庫引擎),但是在oracle中知道它也會很有用:-)

謝謝你們。

回答

5

PHP 5.3支持relative dates like weekdays,例如,

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

據我所知,它需要一些體操從這樣的計算之內甲骨文

+1

非常感謝:D完美。 – Flukey 2010-12-09 12:24:06

1

日期('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); 

對不起,我不知道任何oracle特定的代碼。

+0

哦,我誤讀了你的文章 - 我想「我寧願在週五取得提醒郵件」。你的意思是在這兩種情況下(星期日和星期六)提醒應該在星期五發送。僅僅3個工作日,戈登的方式顯然更好。 – sirion 2010-12-09 12:54:28

+0

不用擔心。感謝您的輸入,雖然!讚賞:-) – Flukey 2010-12-09 13:04:19

1

在Oracle中,得到周(1-7)的那一天,請使用以下

select to_char(sysdate, 'D') 
from dual 

這使得排除週六和週日的微不足道。

然而,「工作日」的確切定義可能因位置(以及企業對企業)而有很大差異,所以在這種情況下,我會建議一個數據庫表來保存特定的業務日期(如實際日期)。