【发布时间】:2014-08-12 01:59:27
【问题描述】:
目前正在从 SQL Server 迁移到 Oracle。我应该应用哪些最佳实践?
我们还遇到了一些问题,比如在 oracle 中 dateadd 函数不起作用。
MSSQL 代码
USE [TEST]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER FUNCTION [dbo].[GET_MONTHS_LAST_DAY](@MON int)
RETURNS DATETIME
AS
BEGIN
RETURN DATEADD(dd, -DAY(DATEADD(m,1,getdate())), DATEADD(m,-MON+1,datediff(dd,0,getdate())))
END
转换后的 Oracle
创建或替换
FUNCTION GET_MONTHS_LAST_DAY
(
v_MON IN NUMBER
)
RETURN DATE
AS
BEGIN
RETURN utils.dateadd('DD', -utils.day_(utils.dateadd('M', 1, SYSDATE)), utils.dateadd('M', -v_MON + 1, utils.datediff('DD', 0, SYSDATE)));
END;
知道为什么我不能编译 oracle 函数吗?我在这里看到的唯一一件事是 dateadd 函数在 oracle 中不可用。谢谢。
【问题讨论】:
-
简单的谷歌搜索显示了大量的样本与 SQL Server 在 Oracle 中的
DATEADD对应物。可以追溯到 2007 年的 One of the samples 建议您使用INTERVAL文字。 Official documentation on usingINTERVALliterals 来自数据库 SQL 语言参考。我认为这个问题有很多重复,可能会引起“我应该应用的最佳实践”的讨论,因此除非你改写它,否则应该以目前的形式关闭。 -
如果您添加了编译失败错误消息,我们可能会提供进一步的帮助。
-
如果您想自己滚动,创建下个月的日期和减去前一天的日期会容易得多,但 Oracle 已经有一个 LAST_DAY 函数:@987654324 @
标签: sql sql-server oracle date