我有一个Oracle查询,如下所示:
SELECT ...
FROM ...
WHERE ...
AND to_char(a.bill_Date, 'MMYYYY') = '072017'
...
ORDER BY ...
在SQL Server中,我们有MONTH()和YEAR()函数。
SELECT ...
FROM ...
WHERE ...
AND MONTH(a.BILL_DATE) = MONTH(GETDATE())
AND YEAR(a.BILL_DATE) = YEAR(GETDATE())
...
ORDER BY ...
是否有一些东西允许我通过一个步骤应用像Oracle一样使用to_char的月 - 月约束?我必须通过一个通用接口进行参数化并保持与两个数据库的兼容性。现在,一个需要两个参数而另一个只需一个。
答案 0 :(得分:3)
要在SQL Server(2012及更高版本)中获取年份和月份,您可以使用FORMAT
:
FORMAT(值,格式[,文化])
WHERE ...
AND FORMAT(a.bill_Date, 'yyyyMM') = '201707';
--or
WHERE ...
AND FORMAT(a.bill_Date, 'MMyyyy') = '072017';
<强> Rextester Demo 强>
请注意,FORMAT(a.bil_Date, 'MMyyyy')
不具备SARG功能,因此不会使用索引。
答案 1 :(得分:2)
我认为SQL Server中与Oracle TO_CHAR
函数最接近的是CONVERT
。但即使使用CONVERT
,我也看不到只请求年份和月份的选项。相反,我们至少还需要接受这一天,并且可能还需要一个时间戳。
CONVERT
接受日期格式掩码参数作为其第三个参数。 112
掩码仅以以下格式返回日期:
yyyymmdd
因此,对于你问题中的日期,它会返回:
201707dd
我离开dd
未定义,因为我不知道给定记录可能有哪一天。现在我们可以通过输出此输出的左侧6个字符来接近您想要的内容,例如
WHERE ... AND
LEFT(CONVERT(varchar, a.bill_Date, 112), 6) = '201707'
答案 2 :(得分:1)
您可以重写Oracle查询,以避免数据转换为char:
SELECT ...
FROM ...
WHERE ...
AND EXTRACT (MONTH FROM a.bill_Date) = 7
AND EXTRACT (YEAR FROM a.bill_Date) = 2017
...
ORDER BY ...
和等效的SQL Server
SELECT ...
FROM ...
WHERE ...
AND MONTH(a.bill_Date) = 7
AND YEAR(a.bill_Date) = 2017
...
ORDER BY ...