2017-06-01 5 views
3

Ich habe Probleme beim Schreiben von SQL Server-Abfragen/Prozeduren mit DateTime Format in den Tabellen.Vergleichen Sie datetime Wert in gespeicherte Prozedur

Meine Anwendung läuft auf einem Standard-ASP.NET MVC4-Stack mit SQL Server.

Mein Tisch Bookings hat diese Struktur:

CREATE TABLE [dbo].[Bookings] 
(
    [BookingId] INT IDENTITY (1, 1) NOT NULL, 
    [ShowId] INT NOT NULL, 
    [RowId]  INT NULL, 
    [Username] VARCHAR(100) NULL, 
    [PaymentId] INT NULL, 
    [ShowDate] DATETIME NULL, 
    ..... 
    ....  
); 

Ich habe zwei gespeicherte Prozeduren geschrieben, in dem ich versuche Tabellenspalte ShowDate mit unterschiedlichen Datumsparameter in Stored Procedure deklariert zu vergleichen.

Verfahren # 1:

CREATE PROCEDURE [dbo].[GetBookingsByDate] 
    @venueid int, 
    @fromdate datetime, 
    @todate datetime 
AS 
BEGIN 
    SELECT 
     City, Title, ScreenTitle, ShowDate, 
     SUM([Qty]) AS Quantity, 
     SUM([Charges]) AS TotalAmount, 
     SUM([OtherCharges]) AS OtherCharges 
    FROM 
     ShowBookings 
    WHERE 
     Venueid = @venueid 
     AND ShowDate BETWEEN @fromdate AND @todate 
    GROUP BY 
     ScreenId, ShowDate, Venueid, Title, ScreenTitle, City 
END 

Verfahren # 2:

CREATE PROCEDURE [dbo].[GetAudienceReportsHistory] 
    @state varchar, 
    @city varchar, 
    @theaterName varchar, 
    @showdate datetime 
AS 
BEGIN 
    SELECT 
     b.BookingId, b.MobileNo, b.SeatNumbers, b.EmailId, 
     sc.ScreenTitle, sh.ShowTime, a.Title, 
     b.Username, b.SMSStatus 
    FROM 
     Bookings b 
    JOIN 
     Shows sh ON b.ShowId = sh.Id 
    JOIN 
     Venues AS v ON sh.Venue_Id = v.Id 
    JOIN 
     Artifacts a ON sh.Artifact_Id = a.Id 
    JOIN 
     Screens AS sc ON sh.Screen_ScreenId = sc.ScreenId 
    WHERE 
     b.ShowDate = @showdate 
     AND b.IsBooked = 'true' 
     AND b.TimeSolt = '0' 
     AND v.Title = @theaterName 
     AND v.City = @city 
END 

Wie Sie Verfahren # 1 nimmt zwei Datetime-Parameter sehen können, fromdate und todate. Die zweite Prozedur benötigt nur einen Datetime-Parameter showdate.

Prozedur 1 gibt die korrekte Ergebnismenge zurück, jedoch führt Prozedur 2 keine Ergebnisse zurück. Aber ich habe in den Tabellen überprüft, dass ich richtige Daten habe, die für die Proc2-Abfrage zurückgegeben werden sollen. Es scheint einige DateTime-Formatkonflikte zu geben.

Ich sende Datetime Parameter zu den Abfragen in "JJJJ-MM-TT" Format (zB: 2017-05-30). In der Tabelle ist die Spalte ShowDate im Format "TT-MM-JJJJ" (zB: 30.05.2017) gespeichert.

Ich habe versucht, den Parameter in verschiedenen Datumsformaten zu senden, aber ich bekomme keine Ergebnisse für Proc2. Bitte hilf mir, das zu lösen. Danke im Voraus. Lassen Sie mich wissen, wenn Sie weitere Informationen benötigen.

+0

Sie Zeitkomponente fehlen - Sie müssen b.ShowDate to Date werfen, wenn @showdate ist so etwas wie ‚2017.06.01 00: 00: 00: 00000 ' – PacoDePaco

+0

Bitte veröffentlichen Sie einige Ihrer aktuellen Datum/Uhrzeit Einträge. Meine Vermutung wäre, dass Sie Daten mit einem Zeitelement haben. Wenn Sie also nach einem Bereich suchen, werden sie gefunden, aber ein genaues Datum würde nur mit Daten übereinstimmen, bei denen der Zeitabschnitt 00:00 – JeffUK

+0

In Proc1 ist die Abfrage auf a Einzeltisch. In 'Proc2' befindet sich die Abfrage in mehreren Tabellen mit Joins. Es kann sein, dass ein oder mehrere Joins fehlschlagen (d. H. Es gibt keine übereinstimmenden Daten). Haben Sie das konkret untersucht? –

Antwort

0

müssen Sie beachten, dass datetime Zeit enthält, also, wenn Sie das mit einem datetime Feld gleichsetzen, wird es nie wegen des Zeitunterschieds gleich sein ... was Sie tun können, ist beide Daten zu werfen ... während zwischen den gefangenen Zeit innerhalb der Datum

cast(showdate as date) = cast(@showdate as date) 

oder DATEDIFF

datediff(day,@showdate,showdate) = 0  
+1

Er könnte auch 'DATEDIFF' verwenden. – KtX2SkD