将SQL Server日期转换为Oracle

时间:2012-11-15 23:48:03

标签: sql sql-server oracle

从SQL Server,我需要能够基于日期列从Oracle数据库中提取一些信息。

SET @foo = 'SELECT * from OPENQUERY(' + @LinkedServer +
', ''SELECT *
    FROM Table1
    WHERE date_revised > '''''+@myDate+'''''')'

不要介意'的号码是否已关闭......我会把事情缩短以缩短。我尝试在SQL Server端使用convert(),但我似乎无法找到Oracle接受的格式,因此它不断抛出错误。

至少,我需要日期,时间和分钟。在SQL Developer(Oracle)中测试值以找出可接受的格式时,我会继续遇到这种情况:

select to_date('2010-11-15 12:21:00', 'yyyy/mm/dd hh:mi:ssam') from dual

15-NOV-10

显然,我指的是我想要时间,但它只是不同意我的看法。我一直坚持这个问题太久了。

简而言之,如何将SQL Server datetime格式化为Oracle to_date函数将接受的格式,以及如何正确显示该函数的日期和时间?

4 个答案:

答案 0 :(得分:2)

  

SET @FOO =(SELECT * ...

我对此感到皱眉,因为您要将查询结果和*(所有列)分配到变量中?

无论如何,a_horse_with_no_name为您提供了向Oracle呈现的日期时间文字格式,timestamp

SET @query = 'SELECT * FROM Table1
              WHERE date_revised > timestamp ''2010-11-15 12:21:00''';

(我留下制作YYYY-MM-DD HH:MM:SS文字的练习)

答案 1 :(得分:1)

假设@mydate是DATETIME,诀窍是将日期时间更改为SQL Server上具有已知格式的字符串,并使用该格式将其更改回Oracle上的DATE。

SET @foo = 'SELECT * from OPENQUERY(' + @LinkedServer +
', ''SELECT *
     FROM Table1
WHERE date_revised > TO_DATE('''''
                     + CONVERT( varchar( max ), @myDate, 120 )
                     + ''''', ''''yyyy-mm-dd hh24:mi:ss'''') '')'

120部分告诉SQL Server将日期格式化为格式为yyyy-mm-dd hh24:mi:ss的字符串,格式部分告诉Oracle如何将字符串转换回日期。

答案 2 :(得分:0)

由于Oracle与我不合作,我提出了自己的解决方案。我基本上接受了所有内容的DATEPARTS,并在oracle中以相同的格式构建自己的日期字符串。感谢您的所有输入。当我有更多的时间,我会尽力让它工作。这个绑匪现在会这样做。

DECLARE @year varchar(4),
    @month varchar(3),
    @day varchar(2),
    @hour varchar(2),
    @meridian varchar(2),
    @minute varchar(2),
    @second varchar(2),
    @date smalldatetime,
    @OracleTime varchar(50);

SET @date = (SELECT MAX(Processed) FROM MES_CAPP.Signoff)
SET @year = YEAR(@date)
SET @month = DATENAME(m,@date)
SET @day = DAY(@date)
-------------------------------------------------------------------------
IF (DATEPART(hh, @date) >= 12)
BEGIN
    SET @hour = DATEPART(hh, DATEADD(hh, -12, @date))
    SET @meridian = 'PM'
END
ELSE
BEGIN
    SET @hour = DATEPART(hh, @date)
    SET @meridian = 'AM'
END

SET @minute = DATEPART(MINUTE, @date)
SET @second = '00'

SET @OracleTime = @day + '-'  + @month + '-' + @year + ' ' + @hour + ':' + @minute + ':' + @second + ' ' + @meridian

答案 3 :(得分:0)

我接受了Jeff的回答并将其包装在一个返回to_date字符串的函数中。

    CREATE FUNCTION [dbo].[fnOracleTo_DateStringFromMsSqlDate] 
(
    @InputDate datetime
)
RETURNS varchar(100)
AS
BEGIN

    DECLARE @year varchar(4),
        @month varchar(3),
        @day varchar(2),
        @hour varchar(2),
        @minute varchar(2),
        @second varchar(2),
        @date smalldatetime,
        @OracleTime varchar(50),
        @returnString varchar(100)

    SET @year = YEAR(@InputDate)
    SET @month = Month(@InputDate)
    SET @day = DAY(@InputDate)
    -------------------------------------------------------------------------

        SET @hour = DATEPART(HH, @InputDate)

    SET @minute = DATEPART(MINUTE, @InputDate);
    SET @second = datepart(SECOND, @InputDate);

    SET @OracleTime = @day + '-'  + @month + '-' + @year + ' ' + @hour + ':' + @minute + ':' + @second ;
    set @returnString = 'to_date(' + char(39) +  @OracleTime  + char(39) + ',' + char(39) +  'DD-MM-YYYY HH24:MI:SS' + char(39) + ')'

    return @returnString;
END