0

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

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

但是我仍然得到具有order_date2013 年之前值的结果。字段类型是日期时间格式,我认为是 varchar。

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

4

6 回答 6

2

这是我的两分钱

Select * from Order1 where ORDER_DATE between DATEADD(YEAR, DATEDIFF(YEAR, 0, GETDATE()), 0) and GETDATE()
于 2013-07-25T11:52:06.790 回答
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 )
于 2013-07-25T11:34:11.760 回答
1

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

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

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

于 2013-07-25T11:43:46.570 回答
1

为什么不

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

拉吉

于 2013-07-25T11:28:44.837 回答
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 日。

于 2013-07-25T11:28:58.877 回答
-1

尝试这个,

WHERE ORDER_DATE BETWEEN YEAR(ORDER_DATE) AND YEAR(GETDATE())
于 2013-07-25T11:30:21.327 回答