2016-07-01 8 views
-1

Ich bin auf der Suche nach den Daten in SQL (Azure) in eine ganze Zahl zu konvertieren, damit ich beide Daten subtrahieren kann. Das Datumsformat ist "JJJJ-MM-TT" und ich möchte, dass meine Fallanweisung Null als Enddatum zurückgibt, wenn mehr als 25 Tage in einem Monat vorhanden sind (wenn die Differenz zwischen Enddatum und Anfangsdatum gleich oder größer ist) als 25). Hier finden Sie meine Frage:SQL - Datum in SQL in Integer für Case-Anweisung konvertieren

SELECT DISTINCT 
    [slot machines].[serial number], 
    [slot machine data].[coin in], 
    'End Date' = (CASE 
        WHEN ([slot machine data].[data calendar start date] - [slot machine data].[data calendar end date]) >= 25 
         THEN NULL 
         ELSE [slot machine data].[data calendar end date] 
        END), 
    casino.casino 
FROM 
    [slot machines], [slot machine data], 
    [slot machine configurations], [casino], [Themes Master List] 
+0

Bitte markieren Sie Ihre Frage mit der Datenbank sind Sie verwenden. –

+0

Ich benutze Sql Azure. Einfach getaggt. – pandoo

+1

[Schlechte Angewohnheiten zu treten: Verwenden von alten JOINs] (http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/08/bad-habits-to-kick-using-old-style-joins. aspx) - diese alte * durch Kommas getrennte Liste von Tabellen * style wurde durch die * richtige * ANSI 'JOIN'-Syntax im ANSI - ** 92 ** SQL Standard ersetzt (** vor mehr als 20 Jahren **) und seine Verwendung wird davon abgeraten –

Antwort

0

Es sieht aus wie Sie SQL Server verwenden. Just do Datumsberechnungen auf ein Datum:

(CASE WHEN [slot machine data].[data calendar start date] >= DATEADD(day, -25, [slot machine data].[data calendar end date]) 
     THEN [slot machine data].[data calendar end date] 
END) 

Sie brauchen noch nicht einmal die ELSE-NULL zurückgegeben, wenn es keine Übereinstimmungen gibt.

+0

Ich habe den folgenden Fehler beim Versuch Ihrer Antwort erhalten: Msg 206, Ebene 16, Status 2, Zeile 1 Operandentyp Kollision: Datum ist nicht kompatibel mit int – pandoo

1
CASE WHEN DATEDIFF(day,[slot machine data].[data calendar start date],[slot machine data].[data calendar end date]) >= 25 THEN NULL ELSE [slot machine data].[data calendar end date] END 
+0

Nur für den Fall, dass die Daten jemals gewechselt oder falsche Reihenfolge in Spalten könnte ich vorschlagen, Verpackung Ihr DATEDIFF() in einem ABS (DATEDIFF()), um immer eine positive ganze Zahl zu testen. Dann würde ich bei einer rein persönlichen Präferenz mein> = 25 zu <= 24 wechseln und die Werte in NULL/ELSE ändern, wenn es mehr Fälle gibt, ist es ein wenig einfacher, sie hinzuzufügen, ohne auf einen möglicherweise falschen Wert zu setzen. – Matt

+0

Ich verstehe Ihren ABS() Vorschlag, aber wenn die Daten ausgetauscht wurden, dann würde es andere Probleme geben, die angesprochen werden müssten, nein? Was ich meine, ich würde wahrscheinlich nicht wollen, dass das zurückkommt, wenn das passiert ist. Ich bin auch mit Daten beschäftigt, vor allem für Parameter, um die vollen 23:59:59 eines jeden Tages zu kompensieren, aber ich habe es so gelassen, wie OP es für den Fall hatte, dass es etwas gab, was sie in Betracht zogen. – scsimon

+1

true Ich denke, du könntest sehen wollen, wenn sie geschaltet werden und es wäre etwas, was ich in meinen eigenen Datensätzen testen würde. Termine speziell mit Zeiten können auf jeden Fall die schwierigste sein! Und dann zu wissen, wann du diesen einen Tag wieder in datediff einfügen willst oder nicht ... Es ist fast so frustrierend wie das dynamische Teilen einer Saite :) – Matt

0

Nicht, dass ich diese Technik vertrete aber die Gründe zu erläutern, warum

([slot machine data].[data calendar start date] - [slot machine data].[data calendar end date]) >= 25 

nicht und funktioniert den Fehler in Ihrem Kommentar bekommen:

Msg 206, Level 16, State 2, Line 1 Operand type clash: date is incompatible with int 

ist, weil man oder beide Datumsfelder ([data calendar start date],[data calendar end date]) sind DATE Datentyp kein anderer Datentyp wie DATETIME. WENN beide Felder DATETIME dann würde Ihre Fallanweisung funktionieren.

Technisch gesehen könnten Sie Ihre Spalten als DATETIME und CAST werfen, der als INT führen ........

CAST((CAST([slot machine data].[data calendar start date] AS DATETIME) - CAST([slot machine data].[data calendar end date]) AS DATETIME) AS INT) >= 25 

Die letzte CAST AS INT ist nur erforderlich, da Sie speziell auf die anderen Werte Gießen werden, wenn sie sind bereits DATETIME Sie es nicht zu tun haben ......

DATEDIFF() ist eine viel einfachere Methode dachte, würde ich darauf hinweisen, warum Sie das Problem mit Ihrem Code hatte.

Eine Sache, über die man möglicherweise nachdenken kann, ist die Verwendung von ABS(DATEDIFF()), wenn Ihre Daten jemals so weit wie alt/neu gemischt werden und ein negatives Ergebnis erzeugen. ABS ist der absolute Wert und führt immer zu einer positiven ganzen Zahl.

Ein Beispiel in der Lage zu zeigen, zu tun, was Sie wollen, wenn Werte DATETIME

DECLARE @StartDate DATE = GETDATE() - 10 
DECLARE @Now DATE = GETDATE() 
DECLARE @StartDateDT DATETIME = GETDATE() - 10 
DECLARE @NowDT DATETIME = GETDATE() 

SELECT 
    CAST(CAST(@Now AS DATETIME) - CAST(@StartDate AS DATETIME) AS INT) 
    ,CAST(@Now AS DATETIME) - CAST(@StartDate AS DATETIME) - 0 
    ,@NowDT - @StartDateDT