无法在where子句中比较转换后的变量

时间:2018-10-12 19:19:18

标签: sql sql-server

在我的数据库中,我有一列Period的列int,其值采用YYYYMM格式,例如201709。还有名为Date类型的datetime列,其值例如为2015-07-31 00:00:00.000。我想选择两列相等的行,例如Period(201507)= Date(201507)。

我尝试了以下代码:

SELECT TOP 100 * 
FROM db
WHERE CONVERT(NVARCHAR, Period) = LEFT(CONVERT(NVARCHAR, (DATEADD(month, -11, Date)), 112), 6) 

这样做将返回0行。

我也尝试过:

WHERE Period = CONVERT(INT, (LEFT(CONVERT(NVARCHAR, (DATEADD(month, -11, Date)), 112), 6))) 

我当然是第一次尝试:

WHERE Period = LEFT(CONVERT(NVARCHAR, (DATEADD(month, -11, Date)), 112), 6))) 

我已经在数据库中检查了值应该匹配的行。

如何检索我想要的行?

2 个答案:

答案 0 :(得分:1)

最简单的方法是从日期字段中提取“年”和“月”分量并将其格式化为整数。

WHERE Period = YEAR(Date) * 100 + MONTH(Date)

答案 1 :(得分:0)

您需要将Period转换为正确的格式,以与nvarchar格式匹配以进行第二次比较:

您可以通过多种方法来执行此操作,其中一种方法是尝试使用CONVERT(NVARCHAR, Period)代替它,然后查看是否对您有用:

CONVERT(NVARCHAR, Year(Period)) + CONVERT(NVARCHAR, Month(Period))