0

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 Serverdatetimeを Oracle のto_date関数が受け入れる形式にフォーマットする方法と、その関数に日付と時刻を適切に表示させる方法を教えてください。

4

4 に答える 4

2

SET @FOO = (SELECT * ...

クエリの結果と*(すべての列) も変数に割り当てているので、私は眉をひそめますか?

とにかく、 a_horse_with_no_name は、Oracleに提示する必要があるdatetimeリテラルの形式を与えています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の部分は、SQLServerに日付をyyyy-mm-ddhh24:mi:ssの形式の文字列にフォーマットするように指示し、formatの部分は、文字列を日付に戻す方法をOracleに指示します。

于 2012-11-16T06:26:49.027 に答える
0

オラクルは私に協力的ではなかったので、私は独自の解決策を思いつきました。私は基本的DATEPARTSにすべてを取り、オラクルで同じ形式で独自の日付文字列を作成します。ご意見ありがとうございます。時間ができたら、これを正常に機能させるようにします。今のところ、この絆創膏で十分です。

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

私はジェフの答えを取り、それを 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 に答える