【发布时间】:2017-11-02 06:19:38
【问题描述】:
我在表格中以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 的任何结果。请帮我解决这个问题。提前致谢。如果您需要更多信息,请告诉我。
【问题讨论】:
-
您缺少时间组件 - 如果 @showdate 类似于 '2017-06-01 00:00:00:00000',您需要将 b.ShowDate 转换为 Date
-
请张贴一些您的实际日期/时间条目。我的猜测是您的日期带有时间元素,因此当您搜索找到它们的范围时,但确切的日期只会匹配时间部分为 00:00 的日期
-
在
Proc1中,查询在单个表上。在Proc2中,查询在多个具有连接的表上。可能是一个或多个连接失败(即没有匹配的数据)。你有没有专门调查过这个? -
DATETIME始终包含 both 日期 和 时间,并且与相等运算符=的比较必须匹配 两个部分 完全正确。如果您使用的是 SQL Server 2008,并且您仅对日期感兴趣 - 时间无关紧要 - 那么我强烈建议使用DATE作为数据类型,而不是DATETIME-DATE仅 存储没有任何时间的日期,因此比较将在当天进行 - 而不是在当天的几毫秒...... -
Bad habits to kick : declaring VARCHAR without (length) - 您应该始终为您使用的任何
varchar变量和参数提供一个长度!否则,您的存储过程参数(@state、@city、@theatername)会突然恰好是一个字符——这通常不是你所期望的或想要 - 定义一个长度 - 总是。
标签: sql asp.net sql-server datetime stored-procedures