2009-12-30 146 views
1

我在表中有datecreated字段。它包含值“2009-12-30 11:47:20:297” 我有这样的查询:要从日期时间在sql中获取日期

select * 
    from table 
where DateCreated = getdate() 

虽然今天的日期存在一个行,我没有同时执行上面得到该行查询。任何人都可以帮忙吗?

+1

彼得·迪切科的答案是最好的之一,它允许使用索引。 – 2009-12-30 08:39:44

+0

您可以标记您正在使用的SQL Server版本,因为SQL 2008具有可投射到的DATE类型。谢谢 – 2011-12-06 00:19:12

回答

3

您的查询不返回您期望的行的原因是因为GETDATE()返回执行查询时的日期和时间部分。 DateCreated列中的值与时间部分不匹配,因此不会返回任何行。

构建查询的方法有很多,以便根据日期组件评估日期。下面是一个例子:

WHERE YEAR(datecreated) = YEAR(GETDATE()) 
    AND MONTH(datecreated) = MONTH(GETDATE()) 
    AND DAY(datecreated) = DAY(GETDATE()) 

不幸的事实是,使用在柱的功能的任何查询意味着,如果在列上存在的指标,它不能被使用。

+0

但您可以将YEAR(),MONTH(),DAY()转换为表格中的持久计算列,然后将这些列索引...... – 2009-12-30 08:13:01

+1

@marc_s:这听起来像某个滥用人造钥匙的人会想出来。 (抱歉,我无法抗拒;))......尽管如此,请看Peter Di Cecco的答案 - 这是最好的答案,为使用索引提供了机会。 – 2009-12-30 09:00:26

+0

@克雷格:好的,取决于 - 如果你需要例如选择月份很多次(对于月度报告等),这可能是一个有效的方法 – 2009-12-30 09:34:07

3

您可以使用类似这样的SQL Server

CREATE FUNCTION [dbo].[udf_DateOnly](@DateTime DATETIME) 
RETURNS DATETIME 
AS 
BEGIN 
    RETURN DATEADD(dd,0, DATEDIFF(dd,0,@DateTime)) 
END 

此行

DATEADD(dd,0, DATEDIFF(dd,0,@DateTime)) 

将剥离出日期部分。

1

您可以通过使用
CONVERT(varchar(8), GETDATE(), 112)

如果需要的话,可以再改回日期时间,因此你会得到一个日期与时间日期时间转换为字符串,只有日期,分,秒和毫秒设置为零。

+0

虽然这个工作,我不会推荐它。首先,内部完成的字符串操作会降低性能。但更重要的是,它会导致开发人员遇到一些不良和潜在危险的习惯。 – 2010-01-11 08:28:51

+0

绝对值得一提。你还可以告诉我使用这种方法的潜在危险是什么? – Carlos 2010-01-11 09:10:50

2

datetime字段包含日期和时间,精确到毫秒。您的查询只有在数据库中存储的精确毫秒时才有效。

要检查,如果它是今天,但忽略了一天的时间,你可以检查这样一个范围:

select * from table where 
DateCreated >= '2009-12-30' and 
DateCreated < '2009-12-31' 

您可以使用结合与转换的当前日期的功能,如旁观者或Khilon已发布。这是一个使用了旁观者的答案的完整例子。另外,正如克雷格杨指出的那样,这将与索引一起工作。

select * from table where 
DateCreated >= DATEDIFF(dd,0,GETDATE()) and 
DateCreated < DATEDIFF(dd,0,GETDATE()) 
+1

+1:只是强调一下,范围必须包含在一边而不包含在另一边。即> =和<完全如图所示。顺便说一句,要迂腐,日期时间只有17毫秒左右。 – 2009-12-30 09:06:52

+1

PS:我更喜欢旁观者的机制,从'GETDATE()'结果中删除时间。即'DateCreated> = DATEDIFF(dd,0,GETDATE())和DateCreated 2009-12-30 09:24:55

2

最简单的解决方案可能是:

SELECT CAST(GETDATE() as DATE) 
+0

是的,如果您正在使用SQL Server 2008或更新的DATE数据类型,那么。 – 2011-04-12 14:53:26

相关问题