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';
请记住,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 ...
我有一个 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';
请记住,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 ...