2012-11-15 211 views
0

从SQL Server中,我需要能够根据日期列从Oracle数据库中提取一些信息。将SQL Server日期转换为Oracle

SET @foo = 'SELECT * from OPENQUERY(' + @LinkedServer + 
', ''SELECT * 
    FROM Table1 
    WHERE date_revised > '''''[email protected]+'''''')' 

不介意'的号码是否关闭......我剪掉了一些东西以使其缩短。我曾尝试在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函数将接受的格式,以及如何使该函数正确显示日期和时间?

+3

'DATE'有**无格式**。格式化DATE值由客户端完成,而不是服务器(这就是你所看到的)。如果你需要使用特定格式的输出,你需要使用'to_char()'(在Oracle端)。看到这里:http://sqlfiddle.com/#!4/d41d8/4378 –

+0

@a_horse_with_no_name为了使用上面指定的'@ myDate',我需要有一个'varchar'的权利?当我对'datetime - > varchar'进行类型转换时,是不是变成了某种格式?我尝试了使用to_char的建议,但我得到的错误是:OLE DB提供程序“OraOLEDB.Oracle”对于链接服务器“TED_IMCD”返回的消息“ORA-01841:(full)year必须在-4713和+9999之间,而不是0“。' 动态SQL获得评估为'WHERE date_revised> to_char(timestamp'2012年11月15日上午11:12','YYYY.MM.DD HH24:MI:SS')' – Jeff

+0

您需要传递:1.代表日期是已知的格式。 2. TO_CHAR的参数,它再次定义了该格式。 'to_char(timestamp'Nov 15 2012 11:12 AM','YYYY.MM.DD HH24:MI:SS')'没有实现先前的答案。 –

回答

0

自从甲骨文与我不合作以来,我提出了自己的解决方案。我基本上采取了一切的DATEPARTS,并在oracle中以相同的格式构建我自己的日期字符串。感谢您的所有输入。当我获得更多时间时,我会尝试按照应有的方式进行工作。这个bandaid现在会做。

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 
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文字给你)

+0

不,他正在构建一个包含OPENQUERY的字符串并将其加载到一个字符串变量中,我猜他以后会执行这个变量......这可能也会引起一些混淆。 –

+0

不挑剔,但我在谈论这个:_you're分配查询的结果,和*(所有列)以及变量?_。不是这种情况。他只是分配一个字符串。他没有分配查询结果。但无论如何你的解决方案是正确的。 –

+0

touche!感谢upvote :) – RichardTheKiwi

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如何将字符串回一个日期。

+0

我很确定我尝试了所有可用于格式化的选项(1-131),Oracle并不真的喜欢它们中的任何一个。接近一个是科威特格式(130或131,但不完全...) – Jeff

+0

您可以用任何你喜欢的方式格式化它。您只需在TO_DATE函数的另一端正确“解除格式化”即可。这里发布了不少工作解决方案。 –

0

我把杰夫的答案,并把它包在返回一个字符串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