Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将SQL Server日期转换为Oracle_Sql_Sql Server_Oracle - Fatal编程技术网

将SQL Server日期转换为Oracle

将SQL Server日期转换为Oracle,sql,sql-server,oracle,Sql,Sql Server,Oracle,在SQLServer中,我需要能够根据日期列从Oracle数据库中提取一些信息 SET @foo = 'SELECT * from OPENQUERY(' + @LinkedServer + ', ''SELECT * FROM Table1 WHERE date_revised > '''''+@myDate+'''''')' 如果“的编号已关闭,请不要介意。。。我把东西剪下来,把它缩短。我曾尝试在SQL Server端使用convert(),但似乎找不到Oracle可

在SQLServer中,我需要能够根据日期列从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
函数可以接受的格式,以及如何使该函数正确显示日期和时间

设置@FOO=(选择*…)

我对此表示不满,因为您正在将查询结果和
*
(所有列)分配到一个变量中

不管怎么说,一个没有名字的“马”给了你需要呈现给Oracle的datetime文本的格式,即
时间戳

SET @query = 'SELECT * FROM Table1
              WHERE date_revised > timestamp ''2010-11-15 12:21:00''';
(我将生成YYYY-MM-DD HH:MM:SS文本的练习留给您)

设置@FOO=(选择*…)

我对此表示不满,因为您正在将查询结果和
*
(所有列)分配到一个变量中

不管怎么说,一个没有名字的“马”给了你需要呈现给Oracle的datetime文本的格式,即
时间戳

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

(我将生成YYYY-MM-DD HH:MM:SS文本的练习留给您)

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

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

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

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

由于Oracle与我不合作,我提出了自己的解决方案。我基本上采用了所有内容的
日期部分
,并构建自己的日期字符串在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

我提出了我自己的解决方案,因为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

我接受了Jeff的答案,并将其封装在一个返回to_日期字符串的函数中

    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

我接受了Jeff的答案,并将其封装在一个返回to_日期字符串的函数中

    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

日期
没有格式。
日期
值的格式设置由客户端完成,而不是服务器(这就是您看到的)。如果需要特定格式的输出,则需要使用
to_char()
(在Oracle端)。请参见此处:@a_horse_with_no_name为了使用上面指定的
@myDate
,我需要将其设置为
varchar
对吗?当我键入
datetime->varchar
时,它不是以某种方式格式化了吗?我尝试了您的建议,使用to_char来代替,但我得到了错误:
OLE DB provider链接服务器“TED_IMCD”的“OraOLEDB.Oracle”返回消息“ORA-01841:(完整)年份必须介于-4713和+9999之间,而不是0”。
动态sql将计算为
WHERE date_revision>to_char(时间戳“2012年11月15日11:12AM”,“YYYY.MM.DD HH24:MI:SS”)
您需要传递:1.表示已知格式的日期的字符串。2.to_CHAR的参数,该参数再次定义了该格式。
to_CHAR(时间戳'Nov 15 2012 11:12AM','YYYY.MM.DD hhh24:MI:SS')
未实现先前的答案。使用
时间戳'…'
时,格式必须为ISO(就像我在SQLFiddle中展示的那样)。这是指定日期文字的(ANSI)SQL标准。您不能对这样的SQL日期文字使用任何任意格式。
date
没有格式。
date
值的格式化是由客户端完成的,而不是服务器(这就是您看到的)。如果需要特定格式的输出,则需要使用
to_char()
(在Oracle端)。请参见此处:@a_horse_with_no_name为了使用上面指定的
@myDate
,我需要将其设置为
varchar
对吗?当我键入
datetime->varchar
时,它不是以某种方式格式化了吗?我尝试了您的建议,使用to_char来代替,但我得到了错误:
OLE DB provider“OraOLEDB.Oracle“对于链接服务器”TED_IMCD“返回消息”ORA-01841:(完整)年份必须介于-4713和+9999之间,而不是0。”
动态sql将求值为
WHERE date_revision>为_char(时间戳“2012年11月15日11:12AM”,“YYYY.MM.DD HH24:MI:SS”)
您需要传递:1.表示已知格式的日期的字符串。2.to_CHAR的参数,该参数再次定义了该格式。
to_CHAR(时间戳'Nov 15 2012 11:12AM','YYYY.MM.DD hhh24:MI:SS')
未实现先前的答案。使用
时间戳'…'
时,格式必须为ISO(就像我在SQLFiddle中展示的那样)。这是指定日期文字的(ANSI)SQL标准。你不能对这样的SQL日期文字使用任何任意格式。不,他正在构建一个包含OPENQUERY的字符串,并将其加载到字符串变量w中