복붙노트

[SQL] 오라클에 연결되어 SQL 서버에서 SQL 쿼리를 작성할 때 어떻게 날짜 리터럴을 지정합니까?

SQL

오라클에 연결되어 SQL 서버에서 SQL 쿼리를 작성할 때 어떻게 날짜 리터럴을 지정합니까?

나는 오라클 12.1 데이터베이스에 연결된 SQL 서버 12.0 데이터베이스를 가지고있다.

나는 오라클 테이블에서 데이터를 반환 날짜별로 필터링하는 SQL Server 데이터베이스에서 뷰를 만들려고합니다. 오라클 테이블은 날짜 열에 인덱스가 있습니다.

성공적으로 작동하는 쿼리는 다음과 같습니다

select * from ORADB..SCHEMA.MYTABLE where MYDATE >= '20140701';

그러나 이것은 매우 느리게 실행됩니다. 나는 모든 행이 반환되도록 비교가 SQL 서버에서 일어나고 때문입니다 가정합니다.

만약 내가 간다면:

DECLARE @earliest date = '20140701';
select * from ORADB..SCHEMA.MYTABLE where MYDATE >= @earliest;

그런 다음 테이블에 오라클 인덱스가 사용되도록 조건이 오라클에 전달되는 아마도 때문에, 빠른 실행됩니다.

내 문제는 내가보기를 만들 것입니다. 내가보기를 생성 할 코드의 두 번째 버전을 사용하는 방법을 찾을 수 없습니다. 간단히 말해서 나는 할 경우 :

create myview as select * from ORADB..SCHEMA.MYTABLE where MYDATE >= '20140701';

그런 다음 천천히 실행됩니다.

SQL 서버는 오라클에 전달합니다, 또는 다른 해결책이 있다고 날짜 리터럴에 대한 다른 형식이 있습니까? 이 오라클에 대한 링크를 만드는 데 사용되는 매개 변수를 함께 할 수 있다면 나 또한 궁금해. 참고로 그들이 있습니다 :

USE [master]
GO
EXEC master.dbo.sp_addlinkedserver @server = N'ORADB', @srvproduct=N'Oracle', @provider=N'OraOLEDB.Oracle', @datasrc=N'DPDB'
EXEC master.dbo.sp_addlinkedsrvlogin @rmtsrvname=N'ORADB',@useself=N'False',@locallogin=NULL,@rmtuser=N'MYUSER',@rmtpassword='#######'
GO
EXEC master.dbo.sp_serveroption @server=N'ORADB', @optname=N'collation compatible', @optvalue=N'false'
GO
EXEC master.dbo.sp_serveroption @server=N'ORADB', @optname=N'data access', @optvalue=N'true'
GO
EXEC master.dbo.sp_serveroption @server=N'ORADB', @optname=N'dist', @optvalue=N'false'
GO
EXEC master.dbo.sp_serveroption @server=N'ORADB', @optname=N'pub', @optvalue=N'false'
GO
EXEC master.dbo.sp_serveroption @server=N'ORADB', @optname=N'rpc', @optvalue=N'false'
GO
EXEC master.dbo.sp_serveroption @server=N'ORADB', @optname=N'rpc out', @optvalue=N'false'
GO
EXEC master.dbo.sp_serveroption @server=N'ORADB', @optname=N'sub', @optvalue=N'false'
GO
EXEC master.dbo.sp_serveroption @server=N'ORADB', @optname=N'connect timeout', @optvalue=N'0'
GO
EXEC master.dbo.sp_serveroption @server=N'ORADB', @optname=N'collation name', @optvalue=null
GO
EXEC master.dbo.sp_serveroption @server=N'ORADB', @optname=N'lazy schema validation', @optvalue=N'false'
GO
EXEC master.dbo.sp_serveroption @server=N'ORADB', @optname=N'query timeout', @optvalue=N'0'
GO
EXEC master.dbo.sp_serveroption @server=N'ORADB', @optname=N'use remote collation', @optvalue=N'true'
GO
EXEC master.dbo.sp_serveroption @server=N'ORADB', @optname=N'remote proc transaction promotion', @optvalue=N'true'
GO

편집 : 로컬 필터에 원격 쿼리는 SQL을 강제로 원격으로 대신 : 난 그냥 아주 비슷한 질문을 발견

해결법

  1. ==============================

    1.나는 ODBC 형식을 선호한다 :

    나는 ODBC 형식을 선호한다 :

    --DateTime
    SELECT {ts'2015-09-20 12:30:00'}
    --Time (however this comes with "today"-time)
    SELECT {t'12:30:00'}
    --Date
    SELECT {d'2015-09-20'}
    GO
    

    간단한 날짜 리터럴은 문화 독립적이지 ...

    SET LANGUAGE ENGLISH;
    SELECT CAST('2014-09-13' AS DATETIME);
    GO
    SET LANGUAGE GERMAN;
    SELECT CAST('2014-09-13' AS DATETIME);--ERROR: there's no month "13"
    GO
    

    그러나 그것은 작동합니다 - 그러나 - 대상 유형 DATE와 (이 차이는 ... 오히려 이상한) :

    SET LANGUAGE ENGLISH;
    SELECT CAST('2014-09-13' AS DATE);
    GO
    SET LANGUAGE GERMAN;
    SELECT CAST('2014-09-13' AS DATE);--ERROR: there's no month "13"
    GO
    

    내가 완전성에 대한 벌금을 작동하는 "전체"ISO 8601을 추가 할 lad2025을 들으 :

    SET LANGUAGE ENGLISH;
    SELECT CAST('2014-09-13T12:30:00' AS DATETIME);
    GO
    SET LANGUAGE GERMAN;
    SELECT CAST('2014-09-13T12:30:00' AS DATETIME);
    GO
    
  2. ==============================

    2.나는 @ lad2025에 의해 제안 전체 ISO 8601 형식을 사용하는 것이 좋습니다 것입니다 :

    나는 @ lad2025에 의해 제안 전체 ISO 8601 형식을 사용하는 것이 좋습니다 것입니다 :

    '2017-10-06T14:57:23'
    

    이 @Shnugo에 의해 제안 된 ODBC 형식으로 우수하다.

    SQL 서버 2014 이상에서, ODBC 형식 것 ISO 8601 형식이하는 반면 이전 1753년 1월 1일에 날짜 (외부 이전 DATETIME 데이터 타입의 범위를 예를 들면, 그 날짜)을위한하지 작업.

    이 자신을 테스트하려면 다음 쿼리를 시도 :

    --This will work
    DECLARE @DateISO DATE = '0001-01-01T00:00:00';
    SELECT @DateISO;
    
    --This will also work
    DECLARE @DatetimeISO DATETIME2 = '0001-01-01T00:00:00';
    SELECT @DatetimeISO;
    
    --This will not work
    DECLARE @DateODBC DATE = {D '0001-01-01'};
    SELECT @DateODBC;
    
    --This will also not work
    DECLARE @DatetimeODBC DATETIME2 = {ts '0001-01-01 00:00:00'};
    SELECT @DatetimeODBC;
    

    당신은 당신이 이제까지 년 1753 전에있을 것입니다 작업을하고 날짜를 생각하지 않는다하더라도, 그것은 될 수있는 좋은 습관입니다. 쿼리에서 참조로 일정 테이블을 설정 보면서 나는이에 달렸다.

  3. ==============================

    3.쿼리는 오라클 데이터베이스에서 실행되는 경우에, 나는 고정 된 형식 YYYY-MM-DD를 사용하는 ANSI 날짜 리터럴을 사용하는 것이 좋습니다.

    쿼리는 오라클 데이터베이스에서 실행되는 경우에, 나는 고정 된 형식 YYYY-MM-DD를 사용하는 ANSI 날짜 리터럴을 사용하는 것이 좋습니다.

    예를 들어,

    DATE '2015-10-20'
    

    오라클에서, '20140701'는 문자열이 아닌 날짜입니다. 당신은 당신의 클라이언트의 로케일 고유의 NLS 설정에 따라 결과를 암시 적 데이터 형식 변환을보고 얻을 운이있을 수 있습니다. 당신은 항상 그것을 피하기, 명시 적으로 날짜 비교를 위해 날짜로 문자열을 변환해야합니다.

  4. from https://stackoverflow.com/questions/33228765/how-do-i-specify-date-literal-when-writing-sql-query-from-sql-server-that-is-lin by cc-by-sa and MIT license