日期之间的数据

时间:2013-02-24 16:33:26

标签: sql sql-server-2008 tsql

我在SQL Server表中有以下数据

 Id    Name   StartDate    EndDate
 1      A      2/2/2012     21/2/012
 2      B      3/2/2012     2/2/2014
 3      C      21/2/2012    3/3/2012
 4      D      1/1/2012     3/3/2012

我想获取所有符合今天日期Start DateEnd Date的行

请帮忙。

2 个答案:

答案 0 :(得分:3)

如果您的意思是希望将范围与当前日期匹配,那么假设StartDateEndDatedate类型,您可以尝试以下操作:

SELECT ...
FROM atable
WHERE CAST(GETDATE() AS date) BETWEEN StartDate AND EndDate
;

以上基本相同:

SELECT ...
FROM atable
WHERE StartDate <= CAST(GETDATE() AS date)
    AND EndDate >= CAST(GETDATE() AS date)
;

但是如果优化器无法将其翻译为第二个版本,则第一个版本可能会产生更糟糕的查询计划。所以,如果表现至关重要,你应该先测试,然后再决定。

请注意,上述两个版本均假设EndDate具有包容性。如果它是独占的,你可以采用第二个版本并稍微修改它:

SELECT ...
FROM atable
WHERE StartDate <= CAST(GETDATE() AS date)
    AND EndDate >  CAST(GETDATE() AS date)
;

你可以进一步简化它:

SELECT ...
FROM atable
WHERE StartDate <= GETDATE()
    AND EndDate >  GETDATE()
;

但是这可能会使用隐式转换,这可能会影响性能,虽然我不能确定在哪个范围内,甚至更少关于这是否可以接受。同样,您需要进行测试和比较。一般来说,我会从一个更简单的版本开始,并记住当我没有(或不再)对目前的表现感到满意时的替代案例。

答案 1 :(得分:1)

根据我能理解的“开始日期和结束日期与今天的日期匹配的数据”,您似乎希望得到StartDate和EndDate等于今天的所有数据。

这是查询:

SELECT *
FROM TableName
WHERE StartDate = cast(getDate() As Date) AND EndDate = cast(getDate() As Date);