我在表中使用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需要两个日期时间参数,fromdate
和todate
。第二个过程只需要一个日期时间参数showdate
。
过程#1返回正确的结果集,但过程#2根本不返回任何结果。但是我在表中交叉检查了我有适当的数据,应该为Proc2查询返回。似乎有一些DateTime格式不匹配。
我正在以“yyyy-mm-dd”格式向查询发送日期时间参数(例如:2017-05-30)。在表格内,ShowDate
列以“dd-mm-yyyy”(例如:30-05-2017)格式存储。
我尝试以不同的日期格式发送参数,但我没有得到任何Proc2的结果。请帮助我解决这个问题。提前致谢。如果您需要更多信息,请告诉我。
答案 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 )