Oracle to SQL Server: Month + Year where 子句

Oracle to SQL Server: Month + Year where clause

我有一个 Oracle 查询如下:

SELECT ...
FROM ...
WHERE ...
    AND to_char(a.bill_Date, 'MMYYYY') = '072017'
    ...
ORDER BY ...

在SQL 服务器中,我们有MONTH() 和YEAR() 函数。

SELECT ...
FROM ...
WHERE ...
    AND MONTH(a.BILL_DATE) = MONTH(GETDATE())
    AND YEAR(a.BILL_DATE) =  YEAR(GETDATE())
    ...
ORDER BY ...

有没有什么东西可以让我像 Oracle 一样通过一个步骤应用 to_char 的月-年约束?我必须使其参数化并通过通用接口保持与两个数据库的兼容性。现在,一个需要两个参数,另一个只需要一个。

我认为在 SQL 服务器中最接近 Oracle 的 TO_CHAR 功能的是 CONVERT。但即使使用 CONVERT 我也看不到仅请求年份和月份的选项。相反,我们至少还需要接受日期,可能还需要接受时间戳。

CONVERT 接受日期格式掩码参数作为其第三个参数。 112 掩码 return 仅是以下格式的日期:

yyyymmdd

所以对于你问题中的日期,它会 return 这个:

201707dd

我未定义 dd 的地方,因为我不知道给定记录可能是哪一天。现在我们可以通过获取此输出的左侧 6 个字符来接近您想要的内容,例如

WHERE ... AND
    LEFT(CONVERT(varchar, a.bill_Date, 112), 6) = '201707'

要在 SQL 服务器(2012 及更高版本)中获取年份和月份,您可以使用 FORMAT:

FORMAT ( value, format [, culture ] )

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,因此不会使用索引。

您可以重写 Oracle 查询以避免数据到字符的转换:

SELECT ...
FROM ...
WHERE ...
    AND EXTRACT (MONTH FROM a.bill_Date) = 7 
    AND EXTRACT (YEAR FROM a.bill_Date) = 2017 
    ...
ORDER BY ...

和等效的SQL服务器

SELECT ... 
FROM ... 
WHERE ...
        AND MONTH(a.bill_Date) = 7 
        AND YEAR(a.bill_Date) = 2017 
        ... 
ORDER BY ...