Asp.net 日历扩展器
我正在asp.net中使用calendarextender控件。它只显示日期,不显示时间。但在插入到数据库时,时间会自动插入。但在where条件下使用date从数据库检索数据时,不会显示相应的记录。我可以对StoredProcess进行哪些修改来解决此问题 我在StoredProcess中使用了以下代码。表的名称为FileMAsp.net 日历扩展器,asp.net,sql,Asp.net,Sql,我正在asp.net中使用calendarextender控件。它只显示日期,不显示时间。但在插入到数据库时,时间会自动插入。但在where条件下使用date从数据库检索数据时,不会显示相应的记录。我可以对StoredProcess进行哪些修改来解决此问题 我在StoredProcess中使用了以下代码。表的名称为FileM Select * from FileM Where OldDate = '@OldDate%' 数据库中的OldDate字段存储为datetime,即日期是我插入的日期,
Select * from FileM Where OldDate = '@OldDate%'
数据库中的OldDate字段存储为datetime,即日期是我插入的日期,但时间是08:00:00:000
或00:00:000
。因此,上面的查询将日期记录为00:00:000
,而不是08:00:00:000
-- 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'
以下代码将删除datetime值的时间部分(删除的意思是将其设置为00:00:00,即午夜):- dateadd(d,datediff(d,0,MyDateTimeColumn),0) 因此,您可以使用:- 从文件M中选择*其中dateadd(d,datediff(d,0,OldDate),0)=@OldDate
或者,如果您使用的是SQL Server 2008,则会有一个(没有时间组件)。只要您的所有日期都没有明确指定时间组件,它们都应该默认为00:00:00.000。在这种情况下,简单的等式比较就可以了。但在代码中,您在参数周围加了引号,这意味着您现在将日期与“@OldDate%”的文本字符串进行比较。删除引号,看看这是否有帮助
我喜欢Luke关于灵活性的回答,但是如果您没有这个选项,并且只能更正现有的存储过程,这可能会有所帮助。您最好只从参数中剥离时间,并将其用于下限,将其设为11:59:59.997作为上限,从而生成一个范围(.999四舍五入到下一个日期的午夜)。这样可以使用索引。如果更改表列值,SQL将无法使用索引