仅使用月份和年份将当前日期与存储的日期时间进行比较

时间:2009-02-13 20:18:50

标签: sql sql-server

使用SQL Server 2005我有一个包含日期时间值的字段。

我要做的是创建2个查询:

  1. 比较以查看存储的日期时间是否与当前日期相同的月份+年
  2. 比较以查看存储的日期时间是否与当前日期相同
  3. 可能有一个简单的解决方案,但是我一直在使用我能找到的各种样品打砖墙,有什么想法吗?

    提前致谢。

6 个答案:

答案 0 :(得分:7)

比较日期部分:

WHERE YEAR( columnName ) = YEAR( getDate() )

答案 1 :(得分:5)

虽然其他答案都有效,但它们都会遇到同样的问题:它们会对列应用转换,因此永远不会在该列上使用索引。

要搜索没有转换的日期,您需要一些内置函数和一些数学。示例如下:

--create a table to hold our example values
create table #DateSearch
(
    TheDate datetime not null
)


insert into #DateSearch (TheDate)
--today
select getdate()
union all
--a month in advance
select dateadd(month, 1, getdate())
union all
--a year in advance
select dateadd(year, 1, getdate())
go

--declare variables to make things a little easier to see
declare @StartDate datetime, @EndDate datetime

--search for "same month+year as current date"
select @StartDate = dateadd(month, datediff(month, 0, getdate()), 0), @EndDate = dateadd(month, datediff(month, 0, getdate()) + 1, 0)

select @StartDate [StartDate], @EndDate [EndDate], TheDate from #DateSearch
where TheDate >= @StartDate and TheDate < @EndDate

--search for "same year as current date"
select @StartDate = dateadd(year, datediff(year, 0, getdate()), 0), @EndDate = dateadd(year, datediff(year, 0, getdate()) + 1, 0)

select @StartDate [StartDate], @EndDate [EndDate], TheDate from #DateSearch
where TheDate >= @StartDate and TheDate < @EndDate

该声明为避免转换所做的是找到大于或等于当前时间段(月或年)开头的所有值,并且所有值小于下一个(无效)时间的开头期。这解决了我们的索引问题,并且还减轻了与DATETIME类型中的3ms舍入相关的任何问题。

答案 2 :(得分:2)

SELECT * FROM atable 
WHERE 
    YEAR( adate ) = YEAR( GETDATE() )
AND
    MONTH( adate ) = MONTH( GETDATE() )

答案 3 :(得分:2)

听起来像DATEDIFF正如你所需要的那样:

-- #1 same month and year
SELECT *
FROM your_table
WHERE DATEDIFF(month, your_column, GETDATE()) = 0

-- #2 same year
SELECT *
FROM your_table
WHERE DATEDIFF(year, your_column, GETDATE()) = 0

答案 4 :(得分:0)

使用datepart函数可以拉出所需的位:

declare @d1 as datetime
declare @d2 as datetime

if datepart(yy, @d1) = datepart(yy, @d2) and datepart(mm, @d1) = datepart(mm, @d2) begin
    print 'same'
end

答案 5 :(得分:0)

你可以使用这样的东西

A)

select *
from table
where MONTH(field) = MONTH(GetDATE()) 
  and YEAR(field) = YEAR(GetDATE())

b)中

select *
from table
where YEAR(field) = YEAR(GetDATE())