[转]MONTHS_BETWEEN Function - Oracle to SQL Server Migration
本文转自:http://www.sqlines.com/oracle-to-sql-server/months_between
In Oracle, MONTHS_BETWEEN(date1, date2) function returns the number of months between two dates as a decimal number.
Note that SQL Server DATEDIFF(month, date2, date1) function does not return exactly the same result, and you have to use an user-defined function if you need to fully emulate the Oracle MONTHS_BETWEEN function (see UDF's code below).
Oracle:
ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD';
-- 1-day difference
SELECT MONTHS_BETWEEN('2013-03-01', '2013-02-28') FROM dual;
# 0.129032258
-- Still 1-day difference but the result is different
SELECT MONTHS_BETWEEN('2013-03-02', '2013-03-01') FROM dual;
# 0.32258065
SQL Server:
DATEDIFF always returns an integer result.
-- 1-day difference, but 1 month returned (!)
SELECT DATEDIFF(month, '2013-02-28', '2013-03-01');
# 1
-- Still 1-day difference but the result is different
SELECT DATEDIFF(month, '2013-03-01', '2013-03-02');
# 0
Also note that MONTHS_BETWEEN and DATEDIFF have different order of parameters. 
Oracle MONTHS_BETWEEN in Detail
MONTHS_BETWEEN returns the number of full months between dates and a fractional part.
An integer value is returned only if:
- Both dates specify the same day of the month (February 13 and March 13 i.e.)
- Both dates are the last days of the months (January 31 and April 30 i.e.)
Oracle:
-- Between March 13 and February 13
SELECT MONTHS_BETWEEN('2013-03-13', '2013-02-13') FROM dual;
# 1
-- Between April 30 and January 31
SELECT MONTHS_BETWEEN('2013-04-30', '2013-01-31') FROM dual;
# 3
Fractional Part
The fractional part is calculated using the following formula:
| Condition | Fractional Part Calculation |
| If day_of_date1 > day_of_date2 | (day_of_date1 - day_of_date2) / 31 |
| If day_of_date1 < day_of_date2 | (31 - day_of_date2 + day_of_date1) / 31 |
Note that when MONTHS_BETWEEN calculates the fractional part, it considers that all months have 31 days.
Consider the following examples:
Oracle:
-- 1-day difference
SELECT MONTHS_BETWEEN('2013-03-01', '2013-02-28') FROM dual;
# 0.129032258
Although there is just 1-day difference between February 28, 2013 and March 01, 2013, MONTHS_BETWEEN considers Feb 29, Feb 30, Feb 31 and Mar 01:
| (31 - 28 + 1) / 31 = 0.129032258 |
Another example:
-- Still 1-day difference but the result is different
SELECT MONTHS_BETWEEN('2013-03-02', '2013-03-01') FROM dual;
# 0.32258065
Now the fractional part is calculated as follows:
| (2 - 1) / 31 = 0.32258065 |
SQL Server User-Defined Function to Emulate Oracle MONTHS_BETWEEN
You can use the following user-defined function to emulate Oracle MONTHS_BETWEEN function:
SQL Server:
CREATE FUNCTION MONTHS_BETWEEN (@date1 DATETIME, @date2 DATETIME)
RETURNS FLOAT
AS
/******************************************************************************
PURPOSE: Emulate Oracle MONTHS_BETWEEN in SQL Server
REVISIONS:
Ver Date Author Description
--------- ---------- --------------- ---------------------------
1.1 2013-02-10 Dmitry Tolpeko (SQLines) Created.
******************************************************************************/
BEGIN
DECLARE @months FLOAT = DATEDIFF(month, @date2, @date1);
-- Both dates does not point to the same day of month
IF DAY(@date1) <> DAY(@date2) AND
-- Both dates does not point to the last day of month
(MONTH(@date1) = MONTH(@date1 + 1) OR MONTH(@date2) = MONTH(@date2 + 1))
BEGIN
-- Correct to include full months only and calculate fraction
IF DAY(@date1) < DAY(@date2)
SET @months = @months + CONVERT(FLOAT, 31 - DAY(@date2) + DAY(@date1)) / 31 - 1;
ELSE
SET @months = @months + CONVERT(FLOAT, DAY(@date1) - DAY(@date2)) / 31;
END
RETURN @months;
END;
GO
Now you can use the UDF as follows:
SQL Server:
-- 1-day difference
SELECT dbo.MONTHS_BETWEEN('2013-03-01', '2013-02-28');
# 0.129032258
-- Still 1-day difference but the result is different (as in Oracle)
SELECT dbo.MONTHS_BETWEEN('2013-03-02', '2013-03-01');
# 0.32258065
[转]MONTHS_BETWEEN Function - Oracle to SQL Server Migration的更多相关文章
- 使用Microsoft SQL Server Migration Assistant for Oracle迁移数据库
前言:使用Microsoft SQL Server Migration Assistant for Oracle迁移Oracle数据库到SqlServer数据库. 准备:Oracle11g.SqlSe ...
- InstallShield高级应用--检查是否安装ORACLE或SQL Server
InstallShield高级应用--检查是否安装ORACLE或SQL Server 实现原理:判断是否存在,是通过查找注册表是否含有相应标识来判断的. 注意:XP与WIN7系统注册表保存方式不一 ...
- ORACLE与SQL SERVER语法区别
一.数据类型 ORACLE与SQL SERVER在数据类型的对比如下: SQL SERVER ORACLE 数字类型 DECIMAL[(P[, S])] NUMBER[(P[, S])] NUMERI ...
- 对Oracle 、SQL Server、MySQL、PostgreSQL数据库优缺点分析
对Oracle .SQL Server.MySQL.PostgreSQL数据库优缺点分析 Oracle Database Oracle Database,又名Oracle RDBMS,或简称Oracl ...
- MySQL、Oracle和SQL Server的分页查询语句
假设当前是第PageNo页,每页有PageSize条记录,现在分别用Mysql.Oracle和SQL Server分页查询student表. 1.Mysql的分页查询: SELECT * FROM s ...
- Datatypes translation between Oracle and SQL Server
Datatypes translation between Oracle and SQL Server part 1: character, binary strings Datatypes tran ...
- Oracle与SQL SERVER编程差异分析(入门)
网上有关Oracle与SQL SERVER性能差异的文章很多,结论往往是让你根据数据量与预算来选择数据库.但实际项目中,特别是使用 .Net 开发的系统,支持以上两种数据库或者更多已经成为Boss的普 ...
- [Oracle][ODBC SQL Server Driver][SQL Server]对象名 'RECOVER.HS_TRANSACTION_LOG' 无效(转)
原帖由 qingyun 于 2010-6-21 15:44 发表 在写pl/sql的时候,有个很重要的注意点:比如:begin update 某个sqlserver的表@dblink名字 .... ...
- Oracle与SQL Server事务处理的比较
事务处理是所有大型数据库产品的一个关键问题,各数据库厂商都在这个方面花费了很大精力,不同的事务处理方式会导致数据库性能和功能上的巨大差异.事务处理也是数据库管理员与数据库应用程序开发人员必须深刻理解的 ...
随机推荐
- js自执行函数、调用递归函数、圆括号运算符、函数声明的提升
前言 起因是我要在jquery的ajax中需要根据返回值来决定是否继续发起ajax请求,这是一个有条件的循环,符合条件就跳出.可以使用while循环的,但是想了想还是递归调用好用. 调用递归函数 递归 ...
- Android 中 LayoutParams 的用法
一个控件应当使用它的父控件的 LayoutParams 类型.因此,一个 TableVow 应该使用 TableLayout.Params . 所以,以一个 TableRow 为例: TableRow ...
- [JXOI2017]颜色 线段树求点对贡献
[JXOI2017]颜色 题目链接 https://www.luogu.org/problemnew/show/P4065 题目描述 可怜有一个长度为 n 的正整数序列 Ai,其中相同的正整数代表着相 ...
- maven指定本地的文件包
maven指定本地的文件包 案例: <!-- CKFinder begin --> <dependency> <groupId>net.coobird</gr ...
- ArrayList 和 Vector 的区别
这两个类都实现了 List 接口( List 接口继承了 Collection 接口),他们都是有序集合,即存储在这两个集合中的元素的位置都是有顺序的,相当于一种动态的数组,我们以后可以按位置索引号取 ...
- Python之机器学习K-means算法实现
一.前言: 今天在宿舍弄了一个下午的代码,总算还好,把这个东西算是熟悉了,还不算是力竭,只算是知道了怎么回事.今天就给大家分享一下我的代码.代码可以运行,运行的Python环境是Python3.6以上 ...
- jersey annotations
参照: http://blog.csdn.net/a19881029/article/details/43056429 官网文档翻译版 @Path 用来为资源类或方法定义URI,当然除了静态URI也支 ...
- Luogu P1342 请柬 题解
差不多是Dijkstra的裸题吧... 这道题可以分为来回两个阶段. 去的时候很简单,直接用一次Dijkstra,然后统计答案. 回来的时候就有些巧妙了,虽然表面上是每个点回到起点,但是何尝不可将其看 ...
- 基于Allwinner的Audio子系统分析(Android-5.1)
前言 一直想总结下Audio子系统的博客,但是各种原因(主要还是自己懒>_<),一直拖到现在才开始重新整理,期间看过H8(Android-4.4),T3(Android-4.4),A64( ...
- (五)Audio子系统之AudioRecord.stop
在上一篇文章<(四)Audio子系统之AudioRecord.read>中已经介绍了AudioRecord如何获取音频数据,接下来,继续分析AudioRecord方法中的stop的实现 函 ...