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_CHARCONVERT 都可能排除在日期列上使用索引的可能性。鉴于您的其他限制,这可能是您唯一的选择,但它可能不是性能最高的选择。 @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 子句的主要内容,如果未能解决你的问题,请参考以下文章

oracle中的TIMESTAMP 对应sqlserver2005中哪个数据类型

在 SQL Server 中使用日期时间

如何在 SQL Server中 将日期格式化

如何在 SQL Server中 将日期格式化

sql server 中取出今年和去年每个月的数据

使用 if 语句定义变量 Oracle SQL Developer