2017-03-01 5 views
0

Ich habe eine Abfrage geschrieben die Datensätze, die ÖFFNUNGSZEIT ist größer als die aktuelle Zeit und die Datumsdifferenz zwischen ÖFFNUNGSDATUM und dem aktuellen Datum sollte < = 3 und> = 0 sein, eigentlich für den Zweck der Benachrichtigung popup, die Ihnen sagt, welche Jobs werden innerhalb von 3 Tagen geöffnet. Sobald es geöffnet wird, sollten keine Datensätze ausgewählt werden, d. H. Die Datumsdifferenz ist 0 und die aktuelle Zeit wird größer als die erwähnte Öffnungszeit.Warum funktioniert meine Abfrage in keinem Szenario?

Jetzt funktioniert meine Abfrage in einigen Fällen wie das Aufnehmen von Datensätzen mit < = 3 und> = 0, aber nicht, wenn die aktuelle Zeit für jeden Tag größer als die Öffnungszeit wird. Da ich AND-Operator verwendet habe, wird es fehlgeschlagen, d. H. Wenn die Öffnungszeit 14:00 ist und die aktuelle Zeit 14:01 ist, dann < = 3 und> = 0 ebenfalls fehlschlägt.

Meine Frage:

Declare @NotificationAllowed bit 
    Set @NotificationAllowed= ISNULL((Select NotificationAllowed from Roles where RoleID= @RoleID),0) 

    IF @NotificationAllowed=1 
    BEGIN 
     Select @NotificationAllowed as IsAllowed, Works.NIT_No, Works.WorkNo, Works.WorkName, DATEDIFF(day, Convert(date,GETDATE()), Works.OpeningDate) as TotalDaysRemaining 
       ,Convert(varchar(11), Works.OpeningDate, 106) as OpeningDate 
     from Works 
     Where DATEDIFF(day, Convert(date,GETDATE()), Works.OpeningDate) <=3 
     AND 
     DATEDIFF(day, Convert(date,GETDATE()), Works.OpeningDate) >=0 
     AND 
     CONVERT(varchar(5), Works.OpeningTime, 108) > CONVERT(varchar(5), GETDATE(), 108) 
     AND 
     Works.Organization_ID= Case When @RoleID=1 then Works.Organization_ID ELSE @OrgID end 
    END 
    ELSE 
    BEGIN 
     Select 0 as IsAllowed, '' AS NIT_No, '' AS WorkNo, '' AS WorkName, '' as TotalDaysRemaining, null as OpeningDate 
    END 
+0

https://spaghettidba.com/2015/04/24/how-to-post-at-sql-question-on-a-public-forum/: Bitte schauen Sie auf diesen Link, um die Frage zu verbessern – TheGameiswar

+0

@TheGameiswar danke Sir, ich werde, aber jetzt können Sie mir bei der Frage helfen? – Covert

+0

Dies ist nicht beantwortbar, bitte nehmen Sie sich etwas Zeit, um den Link durchzugehen und ihn neu zu gestalten – TheGameiswar

Antwort

0

Anstatt zu versuchen, mit Datum und Uhrzeit als separate Felder zu arbeiten, wäre es besser, sie zusammen zu setzen und benutzen Sie einfach den Datetime Datentyp. Ich habe das OpeningTime-Feld aus Ihrem Schema entfernt und das OpeningDate als Datetime verwendet.

create table Works (
    NIT_No int, 
    WorkNO int, 
    WorkName varchar(32), 
    OpeningDate datetime 
) 

Hier einige Beispiel Daten, die ich verwendet:

+ ------ + ------- + -------- + ----------------------- + 
| NIT_No | Work_No | WorkName | OpeningDate    | 
+ ------ + ------- + -------- + ----------------------- + 
| 1  | 1  | Work1 | 2017-02-26 16:21:15.083 | 
| 2  | 2  | Work2 | 2017-02-27 09:21:15.083 | 
| 2  | 3  | Work3 | 2017-03-01 00:21:15.083 | 
| 3  | 4  | Work4 | 2017-03-01 13:09:15.083 | 
| 4  | 5  | Work5 | 2017-03-02 13:21:15.083 | 
| 5  | 6  | Work6 | 2017-03-03 17:21:15.083 | 
| 5  | 7  | Work7 | 2017-03-04 11:45:15.083 | 
| 5  | 8  | Work8 | 2017-03-04 19:21:15.083 | 
+ ------ + ------- + -------- + ----------------------- + 

Sie wollen mit Eröffnungstermin alle Datensätze halten, vor getdate und weniger als drei Tage weg zum _____. Und hier füllen wir das Leerzeichen aus. Interessieren Sie sich für die Genauigkeit der Stunde, Minute, Sekunde? Dies bleibt Ihnen überlassen und hängt wahrscheinlich von Ihrer Anwendung ab. Ich werde Minuten benutzen. Daher möchte ich Daten zwischen 0 und 3 * 24 * 60 Minuten von getdate einbeziehen. Die folgende Abfrage funktioniert nur, dass

Select @NotificationAllowed as IsAllowed, 
     NIT_No, 
     WorkNo, 
     WorkName, 
     DATEDIFF(day, GETDATE(), OpeningDate) as TotalDaysRemaining, 
     OpeningDate as OpeningDate 
    from #Works 
    Where DATEDIFF(Minute, GETDATE(), OpeningDate) between 0 and 3*24*60 

Wenn es auf Mar laufen 1 2017 12.35, erhalte ich folgende Ergebnisse

+ ------ + ------- + -------- + --- + ----------------------- + 
| NIT_No | Work_No | WorkName | TDR | OpeningDate    | 
+ ------ + ------- + -------- + --- + ----------------------- + 
| 3  | 4  | Work4 | 0 | 2017-03-01 13:09:15.083 | 
| 4  | 5  | Work5 | 1 | 2017-03-02 13:21:15.083 | 
| 5  | 6  | Work6 | 2 | 2017-03-03 17:21:15.083 | 
| 5  | 7  | Work7 | 3 | 2017-03-04 11:45:15.083 | 
+ ------ + ------- + -------- + --- + ----------------------- + 

Alles, was Sie tun müssen, ist die logische Programmablauf gehören und die extra Filter für Organisations-ID.

Verwandte Themen