我在asp.net中使用calendarextender控件。它只显示日期,而不是时间。但是在插入数据库时,会自动插入时间。但是在使用日期条件从数据库中检索数据时,不会显示相应的记录。我可以对storedprocedure进行哪些修改来解决此问题。
我在storedprocedure中使用了以下代码。表的名称是FileM
Select * from FileM Where OldDate = '@OldDate%'
databese中的OldDate字段存储为日期时间,即日期是我插入的日期,但时间是08:00:00:000
或00:00:00:000
。所以上面的查询给出了随时间变化的日期记录{{1 },但不是00:00:00:000
答案 0 :(得分:2)
-- assumes that the @OldDate parameter is a DATETIME
SELECT *
FROM FileM
WHERE DATEDIFF(day, OldDate, @OldDate) = 0
如果您能够修改存储过程,那么通过传递两个DATETIME
参数,指定所需范围的开始和结束时间,您可以获得更大的灵活性和性能:
CREATE PROCEDURE dbo.GetRangeOfRecords
@StartDateTime DATETIME,
@EndDateTime DATETIME
AS
SELECT *
FROM FileM
WHERE OldDate BETWEEN @StartDateTime AND @EndDateTime
然后像这样调用您的存储过程,例如:
EXEC dbo.GetRangeOfRecords
@StartDateTime = '2009-02-25 00:00:00.000',
@EndDateTime = '2009-02-25 23:59:59.999'
答案 1 :(得分:0)
以下代码将删除日期时间值的时间部分(通过剥离我的意思是00:00:00,即午夜): -
DATEADD(d,DATEDIFF(d,0,MyDateTimeColumn),0)
所以你可以使用: -
从FileM中选择* dateadd(d,datediff(d,0,OldDate),0)= @OldDate
或者,如果您使用的是SQL Server 2008,则会有new date data type(没有时间组件)。
答案 2 :(得分:0)
只要您的日期没有明确给出时间组件,它们都应默认为00:00:00.000。在这种情况下,简单的相等比较就可以了。但是在你的代码中,你会在你的参数周围加上引号,这意味着你现在正在将你的日期与文字字符串“@ OldDate%”进行比较。删除引号,看看是否有帮助。
我喜欢Luke对灵活性的回答,但是如果你没有这个选项并且只能纠正现有的存储过程,那么这可能会有所帮助。