2010-12-09 10 views
1

Ich verwende Doctrine für das ORM meiner Anwendung. In einer Tabelle habe ich ein 'Startdatum'.PHP oder SQL berechnen 3 Arbeitstage vor einem Datum

in PHP geschrieben, ich 3 Tage vor einem Zeitpunkt berechnen kann:

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

Aber dies schließt Wochenenden, würde Ich mag nur Werktage umfassen.

I.e. Wenn eine Veranstaltung an einem Mittwoch stattfand, würde ich am Sonntag eine Erinnerungs-E-Mail erhalten. Ich würde lieber die Erinnerungs-E-Mail stattdessen an einem Freitag erhalten. Also wie würde ich berechnen, nur Mon-Fri für die Berechnung zu verwenden?

Wenn Sie wissen, wie man es auch in Oracle macht, wäre das großartig.

Ich würde es vorziehen, es in PHP zu haben, so dass ich nicht eine benutzerdefinierten Oracle-Funktion (im Fall mag ich den Datenbank-Engine ändern) verwenden muß, jedoch wäre es nützlich, im Orakel zu wissen auch :-)

Danke Jungs.

Antwort

5

PHP 5.3 unterstützt relative dates like weekdays, z.B.

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

produzieren 2010-12-03 (Freitag) im Gegensatz zu

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

, die von strtotime 2010-12-05 (Sonntag)

Alle unterstützten Formate produzieren wird ebenfalls unterstützt in der DateTime API.

Afaik es einige Gymnastik nimmt von dieser Berechnung zu tun, innerhalb von Oracle

+1

Vielen Dank: D Perfekt. – Flukey

+1

Ich habe heute etwas gelernt. Vielen Dank! – jsuggs

1

Datum ('w') gibt Ihnen eine numerische Darstellung des Wochentags. 0 (Sonntag) bis 6 (Samstag) können Sie einfach überprüfen, ob Ihr Datum 0 oder 6 ist und dann 2 (oder einen) zusätzliche Tage subtrahieren.

 
$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); 

Entschuldigung, ich kenne keinen Oracle-spezifischen Code.

+0

Oh, ich habe Ihren Beitrag falsch gelesen - ich dachte mit "Ich würde lieber die Erinnerungs-E-Mail stattdessen an einem Freitag bekommen." Du meintest, dass in beiden Fällen (Sonntag und Samstag) die Erinnerung am Freitag gesendet werden sollte. Für nur 3 Wochentage ist Gordons Weg deutlich besser. – sirion

+0

Keine Sorge. Danke für deine Eingabe! Wertschätzung :-) – Flukey

1

In Oracle, den Tag der Woche (1-7) zu erhalten, verwenden Sie die folgende

select to_char(sysdate, 'D') 
from dual 

Was es trivial macht, Samstage und Sonntage auszuschließen.

Die genaue Definition von "Geschäftstagen" unterscheidet sich jedoch sehr stark von Ort zu Ort (und von Geschäft zu Geschäft). In diesem Fall würde ich eine Datenbanktabelle vorschlagen, die die spezifischen Geschäftstermine enthält Termine).

+0

Ausgezeichnet, danke! – Flukey

Verwandte Themen