选择日期等于今天的日期减去1天的每个日期-不使用dateadd on Month/year-T SQL

选择日期等于今天的日期减去1天的每个日期-不使用dateadd on Month/year-T SQL,sql,sql-server,date,datetime,Sql,Sql Server,Date,Datetime,正如标题所说,我试图构建一个查询,从日期等于昨天日期的数据库表中选择所有记录 然而,表中的date列的格式是datetime,包含小时、分钟、秒,因此我根据日期进行选择,年、月和日时间不重要,只要日期是昨天 为了实现这一点,我构建了以下查询: SELECT * FROM qryTouchBoekingen WHERE (DATEPART(yyyy, myDateTime) = DATEADD(dd, -1, Datepart(dd, GetDate()))

正如标题所说,我试图构建一个查询,从日期等于昨天日期的数据库表中选择所有记录

然而,表中的date列的格式是datetime,包含小时、分钟、秒,因此我根据日期进行选择,年、月和日时间不重要,只要日期是昨天

为了实现这一点,我构建了以下查询:

SELECT 
    * 
FROM
    qryTouchBoekingen 
WHERE 
    (DATEPART(yyyy, myDateTime) = DATEADD(dd, -1, Datepart(dd, GetDate())) 
    AND (DATEPART(mm, myDateTime) = DATEADD(dd, -1, Datepart(mm, GetDate())) 
    AND (DATEPART(dd, myDateTime) = DATEADD(dd, -1, Datepart(dd, GetDate())) )
ORDER BY
    Starttijd ASC
虽然这不会返回任何记录。当我只在myDateTime列的day部分使用它时,它会工作,但显然也会返回带有该特定日期的所有其他年份和月份

我也无法使用:

SELECT 
    *
FROM
    qryTouchBoekingen 
WHERE 
    myDateTime = DATEADD(dd, -1, GetDate())

因为这会在时间上产生错误

这个简单得多的版本怎么样:

cast(myDateTime as date) = cast(dateadd(day, -1, getdate()) as date)
或者,更好的是:

(myDateTime >=  cast(dateadd(day, -1, getdate()) as date) and
 myDateTime < cast(getdate() as date)
)

这个版本在利用索引的能力上更加明确。第一个还将利用myDateTime上的索引,但这是函数排除使用索引规则的一个例外。

这个简单得多的版本如何:

cast(myDateTime as date) = cast(dateadd(day, -1, getdate()) as date)
或者,更好的是:

(myDateTime >=  cast(dateadd(day, -1, getdate()) as date) and
 myDateTime < cast(getdate() as date)
)
这个版本在利用索引的能力上更加明确。第一种方法还将利用myDateTime上的索引,但这是函数禁止使用索引的规则的一个例外。

试试这个方法。 在制作datepart之前,您应该先计算前一天

Select * from qryTouchBoekingen 
WHERE ( DATEPART(yyyy, myDateTime) = Datepart(dd, DATEADD(dd, -1, GetDate())) 
AND (DATEPART(mm, myDateTime) = Datepart(mm, DATEADD(dd, -1, GetDate())) 
AND (DATEPART(dd, myDateTime) = Datepart(dd, DATEADD(dd, -1, GetDate())) )
Order by Starttijd ASC
试试这个。 在制作datepart之前,您应该先计算前一天

Select * from qryTouchBoekingen 
WHERE ( DATEPART(yyyy, myDateTime) = Datepart(dd, DATEADD(dd, -1, GetDate())) 
AND (DATEPART(mm, myDateTime) = Datepart(mm, DATEADD(dd, -1, GetDate())) 
AND (DATEPART(dd, myDateTime) = Datepart(dd, DATEADD(dd, -1, GetDate())) )
Order by Starttijd ASC
这是否有效:

Select 
    * 
from 
    qryTouchBoekingen 
WHERE 
    CAST( myDateTime AS DATE) = CAST(DATEADD(day, -1, GetDate()) AS DATE)
Order by 
    Starttijd ASC
这是否有效:

Select 
    * 
from 
    qryTouchBoekingen 
WHERE 
    CAST( myDateTime AS DATE) = CAST(DATEADD(day, -1, GetDate()) AS DATE)
Order by 
    Starttijd ASC

啊,太棒了!这样确实更好!谢谢。我只是想澄清一下——让列不受影响地被过滤可以让它利用索引,但是你是说这些是对datetime-to-date转换的特殊优化吗?假设必须使用lot@gordatron . . . 对在SQLServer2008中引入date时,将datetime强制转换为日期也是可以接受的。这里是一个相当详细的讨论它是如何工作的:。啊,太棒了!这样确实更好!谢谢。我只是想澄清一下——让列不受影响地被过滤可以让它利用索引,但是你是说这些是对datetime-to-date转换的特殊优化吗?假设必须使用lot@gordatron . . . 对在SQLServer2008中引入date时,将datetime强制转换为日期也是可以接受的。下面是对其工作原理的详细讨论:。感谢您的提醒和回答!谢谢你的提醒和回答!