比较存储过程中的datetime值

时间:2017-06-01 07:59:43

标签: sql asp.net sql-server datetime stored-procedures

我在表中使用DateTime格式编写SQL Server查询/过程时遇到问题。

我的应用程序在带有SQL Server的标准ASP.NET MVC4堆栈上运行。

我的表Bookings具有以下结构:

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,
    .....
    ....    
);

我编写了两个存储过程,我试图将表列ShowDate与存储过程中声明的不同日期参数进行比较。

程序#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

程序#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

正如您所看到的,过程#1需要两个日期时间参数,fromdatetodate。第二个过程只需要一个日期时间参数showdate

过程#1返回正确的结果集,但过程#2根本不返回任何结果。但是我在表中交叉检查了我有适当的数据,应该为Proc2查询返回。似乎有一些DateTime格式不匹配。

我正在以“yyyy-mm-dd”格式向查询发送日期时间参数(例如:2017-05-30)。在表格内,ShowDate列以“dd-mm-yyyy”(例如:30-05-2017)格式存储。

我尝试以不同的日期格式发送参数,但我没有得到任何Proc2的结果。请帮助我解决这个问题。提前致谢。如果您需要更多信息,请告诉我。

2 个答案:

答案 0 :(得分:0)

你必须注意,日期时间包括时间,所以当你把它等同于日期时间字段时,由于时差,它永远不会相等......你可以做的是投射两个日期......同时在日期之间捕获时间

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

或DateDIFF

datediff(day,@showdate,showdate) = 0    

答案 1 :(得分:0)

您需要像这样转换日期正确格式

CONVERT(date, b.ShowDate) = CONVERT(date,@showdate )