将 PL-SQL 转换为 SQL Server

Posted

技术标签:

【中文标题】将 PL-SQL 转换为 SQL Server【英文标题】:Convert PL-SQL To SQL Server 【发布时间】:2012-03-12 10:42:50 【问题描述】:

我需要一个 sql 函数,它采用有效的 SQL Server 日期并返回该日期的月相。我找到了一个函数,但不幸的是它在pl-sql 中我不了解,我可以按原样转换代码,但我不知道如何在 SQL Server 中获取朱利安日期。

这是我要使用的骨架函数

IF OBJECT_ID (N'dbo.fn_phaseOfMoon', N'FN') IS NOT NULL
    DROP FUNCTION dbo.fn_phaseOfMoon;
GO
CREATE FUNCTION dbo.fn_phaseOfMoon (@DATE datetime)
RETURNS VARCHAR(30) AS
BEGIN
    RETURN 'NA';
END
GO

pl-sql 代码位于here,有人可以指点我正确的方向,或者帮助转换代码吗?

【问题讨论】:

【参考方案1】:

这是我已更改为 MSSQL 的 Java 代码。看看是否对你有用。

CREATE FUNCTION dbo.fn_phaseOfMoon (@Date datetime)
RETURNS INT
BEGIN

Declare @y int,
        @m int,
        @d int,
        @c int,
        @e int,
        @b int,
        @jd float

Select @y = DatePart(yy, @Date), @m = DatePart(mm, @Date), @d = DatePart(dd, @Date)
    /*
      calculates the moon phase (0-7), accurate to 1 segment.
      0 = > new moon.
      4 => full moon.
      */

    if (@m < 3) 
        Select @y = @y - 1, @m = @m + 12
    Select @m = @m + 1;

    Select @c = 365.25 * @y, @e = 30.6 * @m
    Select @jd = @c+@e+@d-694039.09  /* jd is total days elapsed */
    Select @jd = @jd / 29.53          /* divide by the moon cycle (29.53 days) */
    Select @b = convert(int, @jd)          /* int(jd) -> b, take integer part of jd */
    Select @jd = @jd - @b          /* subtract integer part to leave fractional part of original jd */
    Select @b = (@jd * 8) + 0.5    /* scale fraction from 0-8 and round by adding 0.5 */
    if @b = 8
        Select @b = 0          /* 0 and 8 are the same so turn 8 into 0 */
    return @b
END

我对这些东西不太了解,所以你必须检查答案是否正确

Java代码来源:http://www.voidware.com/moon_phase.htm

【讨论】:

感谢您的解决方案,尽管它的工作原理不同。 嗨,我还有 pl-sql 功能吗?你能分享吗?谢谢。

以上是关于将 PL-SQL 转换为 SQL Server的主要内容,如果未能解决你的问题,请参考以下文章

如何将日期对象作为第一个也是唯一的输入参数传递给 PL-SQL

sql server2000如何将数字转换为日期时间

如何使用 SQL 将 Sql Server DateTime 转换为通用时间

有没有办法将 SQL Server 2008 mdf 文件转换为 SQL Server Express 版本?

将 SQL Server DATETIMEOFFSET 转换为 mySQL DateTime

将 Access 删除语句转换为 SQL Server