2016-04-14 8 views
1

Ich muss alle Aufträge zählen, die einen datediff haben < = 1. Ich verwende die COALESCE-Funktion, weil manchmal das Date1 null sein kann.SQL-Datum Diff-Geschäftstage

SELECT COUNT(*) 
FROM Orders 
WHERE DATEDIFF(dd,COALESCE(Date1, Date2),Date0) <= 1 

Gibt es eine Möglichkeit, dass ich nur die Werktage (Mo-Fr) zählen kann?

Danke.

+0

Werktage definieren. Meinst du Mo - Fr oder musst du Feiertage wie Weihnachten ausschließen? Wenn Sie Weihnachten etc. ausschließen müssen, müssen Sie dies in einer Kalendertabelle definieren. –

+0

Entschuldigung, ich brauche Montag bis Freitag – user3175024

+0

Ich schätze, Sie verwenden SQL Server (bitte entsprechend markieren). In diesem Fall können Sie mit der 'DATENAME'-Funktion ermitteln, ob ein Datum an einem Wochenende liegt oder nicht, und danach filtern. –

Antwort

0

Sie Ihre Zählung zu einer bedingten Summe ändern könnte, DATEPART mit der Samstagen und Sonntagen zu ignorieren (die eine dw von 7 & 1 bzw. haben sollte).

SELECT SUM(CASE WHEN DATEPART(dw, COALESCE(Date1, Date2)) BETWEEN 2 AND 6 
      THEN 1 ELSE 0 END) 
FROM Orders 
WHERE DATEDIFF(dd,COALESCE(Date1, Date2),Date0) <= 1 
1

Sie können eine Calendar Tabelle verwenden und alle Werktage darin speichern.

Oder Sie können die folgende einfache Formel verwenden, um die Anzahl der Werktage zwischen zwei Daten zu berechnen. Die Formel geht davon aus, dass Samstag und Sonntag keine Geschäftstage sind. Es wird angenommen, dass zwei gegebene Daten Arbeitstage sind.

Alles, was es tut, ist die Berechnung der normalen Differenz in Tagen und dann subtrahiert 2 (Nicht-Geschäft) Tage von diesem Ergebnis für jeden Anfang der Woche.


Beispiel 1

DECLARE @Date0 date = '2016-04-07'; -- Thursday 
DECLARE @Date1 date = '2016-04-08'; -- Friday 

SELECT 
    DATEDIFF(day, @Date0, @Date1) - 
    DATEDIFF(week, @Date0, @Date1) * 2 AS BusinessDays; 

Ergebnis

BusinessDays 
1 

Beispiel 2

DECLARE @Date0 date = '2016-04-08'; -- Friday 
DECLARE @Date1 date = '2016-04-11'; -- Monday 

SELECT 
    DATEDIFF(day, @Date0, @Date1) - 
    DATEDIFF(week, @Date0, @Date1) * 2 AS BusinessDays; 

Ergebnis

BusinessDays 
1 

Beispiel 3

DECLARE @Date0 date = '2016-04-08'; -- Friday 
DECLARE @Date1 date = '2016-04-18'; -- Monday 

SELECT 
    DATEDIFF(day, @Date0, @Date1) - 
    DATEDIFF(week, @Date0, @Date1) * 2 AS BusinessDays; 

Ergebnis

BusinessDays 
6 

Ihre Abfrage würde wie folgt aussehen:

SELECT COUNT(*) 
FROM Orders 
WHERE 
    DATEDIFF(day, COALESCE(Date1, Date2), Date0) - 
    DATEDIFF(week, COALESCE(Date1, Date2), Date0) * 2 <= 1 
;