Oracle 到 SQL Server:月 + 年 where 子句
Posted
技术标签:
【中文标题】Oracle 到 SQL Server:月 + 年 where 子句【英文标题】:Oracle to SQL Server: Month + Year where clause 【发布时间】:2017-08-20 06:26:10 【问题描述】:我有一个 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 那样应用月-年约束?我必须将此参数化并通过一个通用接口保持与两个数据库的兼容性。现在,一个需要两个参数,另一个只需要一个。
【问题讨论】:
Getting only Month and Year from SQL DATE的可能重复 据我所知没有。与 Oracle 的TO_CHAR()
函数最接近的是 SQL Server 的 CONVERT()
。但这会生成一个带有日组件的字符串。
我从 CONVERT 开始,最后得到了一个复杂的子句。你是对的。
【参考方案1】:
要在 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,因此不会使用索引。
【讨论】:
好答案,没想到用FORMAT
+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'
【讨论】:
目标是获取整个月的数据。不想尝试 BETWEEN 使用BETWEEN
没有任何问题,事实上我相信TO_CHAR
和CONVERT
都可能排除在日期列上使用索引的可能性。鉴于您的其他限制,这可能是您唯一的选择,但它可能不是性能最高的选择。
@TimBiegeleisen 我会说在 SQL Server 中 FORMAT
最接近 TO_CHAR
:)【参考方案3】:
您可以重写您的 Oracle 查询以避免数据到字符的转换:
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 ...
【讨论】:
以上是关于Oracle 到 SQL Server:月 + 年 where 子句的主要内容,如果未能解决你的问题,请参考以下文章