2017-05-08 116 views
1

我有以下代码:Where条件根据年份和月份

select COUNT(STL.ITEID) 

from STORETRADELINES STL 

left join FINTRADE FT ON STL.FTRID=FT.ID 

where RIGHT(CONVERT(datetime, FT.FTRDATE, 3), 5) < RIGHT(CONVERT(datetime, GETDATE(), 3), 5) 
and FT.FTRDATE > CONVERT(datetime,'01.01.2017',103) 

我想选择所有落在2017年1月1日和二零一七年四月三十〇日(始终,前一个月的最后一天之间的文件)。

似乎这样做不好,因为从01.01直到今天所有的文档都会返回。

我在哪里错了?顺便说一句,我使用SQL Server 2008.

谢谢

+1

'31.04.2017'?你使用什么日历系统? –

+0

@Damien_The_Unbeliever,日期在FT.FTRDATE存储如下: 2017-05-04 00:00:00.000 –

+1

幽默在互联网上并不总能很好地表现出来。今年4月31日没有。 –

回答

2

问题是,你正在做字符串比较。使用日期比较,而不是:

select COUNT(STL.ITEID) 

from STORETRADELINES STL 

left join FINTRADE FT ON STL.FTRID=FT.ID 

where FT.FTRDATE < DATEADD(month,DATEDIFF(month,0,GETDATE()),0) 
and FT.FTRDATE >= '20170101' 

这里,DATEADD/DATEDIFF对呼叫进行四舍五入当前日期到当月的开始。

您可以使用类似的DATEADD/DATEDIFF对为创业的时期你的条件下,利用year代替month如果希望此查询是通用的任何本年度


原因你”重新“字符串型”代码不起作用的是您的CONVERT调用将datetime值转换为datetime风格参数在此处被忽略,因为datetime s没有格式。然后,您得到一个不受控制的datetime s隐式转换为varchar,以便RIGHT可以正常工作,并且它的您应该试图控制的转换。

正因为如此,这样的:

select RIGHT(CONVERT(datetime, GETDATE(), 3), 5) 

生成:

:50AM 

,你可以看到希望没有像你想要的东西。

+0

)感谢您的详细解答。这非常有帮助。 –

1

dateadd(mm,datediff(mm, 0 , current_timestamp),0)将返回当月的第一天。
您的查询可能为

SELECT COUNT(STL.ITEID) 
FROM STORETRADELINES STL 
    left join FINTRADE FT ON STL.FTRID=FT.ID 
where 
FT.FTRDATE >= '2017-01-01' AND FT.FTRDATE < dateadd(mm,datediff(mm, 0 , current_timestamp),0) 
+0

由于包含BETWEEN的特性,这也会返回发生在'20170501'正午的行。 –

+0

You are right,@达米安,应该改成'<' – TriV