0

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

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

不要介意数字'是否关闭...我删减了一些内容以使其更短。我曾尝试convert()在 SQL Server 端使用,但我似乎找不到 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 Serverdatetime格式化为 Oracleto_date函数将接受的格式,以及如何使该函数正确显示日期和时间?

4

4 回答 4

2

SET @FOO = (选择 * ...

我对此皱眉,因为您正在将查询结果以及*(所有列)分配给变量?

无论如何,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 文本的练习留给你)

于 2012-11-16T00:26:39.407 回答
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 如何将字符串转回日期。

于 2012-11-16T06:26:49.027 回答
0

由于甲骨文与我不合作,我想出了自己的解决方案。我基本上采用了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
于 2012-11-16T16:56:05.667 回答
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
于 2015-05-27T17:01:12.840 回答