如何在ms sql中获取日期值为THIS年及更晚的记录

时间:2013-07-25 11:23:38

标签: sql-server

我正在尝试使用以下条件检索今年创建的订单:

WHERE ORDER_DATE BETWEEN YEAR(GETDATE()) AND GETDATE()

但我仍然会在2013年之前获得order_date个值的结果。 字段类型是日期时间格式,我认为它是varchar。

当我执行2013-01-01而不是YEAR(GETDATE())时,它会相应地工作。

6 个答案:

答案 0 :(得分:2)

这是我的两分钱

Select * from Order1 where ORDER_DATE between DATEADD(YEAR, DATEDIFF(YEAR, 0, GETDATE()), 0) and GETDATE()

答案 1 :(得分:1)

为什么不

WHERE YEAR(ORDER_DATE) = YEAR(GETDATE())

拉​​吉

答案 2 :(得分:1)

假设GETDATE()返回1/07/2013。

此...

WHERE ORDER_DATE BETWEEN YEAR(GETDATE()) AND GETDATE()

看起来像这样......

WHERE ORDER_DATE BETWEEN '1905-07-07 00:00:00.000' AND '2013-07-01 00:00:00.000'

这是因为从YEAR(GETDATE()返回的值2013表示1905年7月7日投入日期时间。

答案 3 :(得分:1)

我会在今年的1月1日做一些事情 - 例如:

where order_date >= convert( datetime, 
                      convert( varchar(4), getdate() ,120 ) + '-01-01',
                      120
                    )

或者如果喜欢Panagiotis Kanavos,您更喜欢使用year(getdate())

where order_date >= convert( datetime, 
                      convert( varchar(4), year(getdate()) ) + '-01-01',
                      120
                    )

如果我在不止一个地方使用

,我会把它变成一个函数

或(sql server 2012)

where order_date >= DATEFROMPARTS ( year(getdate()), 1, 1 )

答案 4 :(得分:1)

在SQL Server 2012中,您可以使用DATEFROMPARTSDATETIMEFROMPARTS函数从其各个部分创建日期。您的WHERE可以写成:

where order_date >=DATEFROMPARTS(YEAR(GETDATE()),1,1)

这可以避免任何转换,并允许查询优化器使用包含ORDER_DATE的任何现有索引。

答案 5 :(得分:-1)

试试这个,

WHERE ORDER_DATE BETWEEN YEAR(ORDER_DATE) AND YEAR(GETDATE())