Oracle到SQL Server:Month + Year where子句

时间:2017-08-20 06:26:11

标签: sql-server oracle tsql to-char

我有一个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的月 - 月约束?我必须通过一个通用接口进行参数化并保持与两个数据库的兼容性。现在,一个需要两个参数而另一个只需一个。

3 个答案:

答案 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 ...