Oracle에 연결된 SQL Server에서 SQL 쿼리를 작성할 때 날짜 리터럴을 지정하려면 어떻게 해야 합니까?
Oracle 12.1 데이터베이스에 연결된 SQL Server 12.0 데이터베이스가 있습니다.
날짜로 필터링된 오라클 테이블의 데이터를 반환하는 SQL 서버 데이터베이스에 보기를 생성하려고 합니다.오라클 테이블에는 날짜 열에 인덱스가 있습니다.
성공적으로 작동하는 쿼리는 다음과 같습니다.
select * from ORADB..SCHEMA.MYTABLE where MYDATE >= '20140701';
그러나 이 작업은 매우 느리게 실행됩니다.SQL Server에서 비교가 진행되어 모든 행이 반환되기 때문인 것 같습니다.
내가 가면,
DECLARE @earliest date = '20140701';
select * from ORADB..SCHEMA.MYTABLE where MYDATE >= @earliest;
그런 다음 Oracle에 조건이 전달되어 테이블의 Oracle 인덱스가 사용되고 있기 때문에 빠르게 실행됩니다.
제 문제는 뷰를 만들고 싶다는 것입니다.코드의 두 번째 버전을 사용하여 보기를 만드는 방법을 찾을 수 없습니다.내가 간단히 한다면,
create myview as select * from ORADB..SCHEMA.MYTABLE where MYDATE >= '20140701';
그러면 천천히 달립니다.
SQL Server가 Oracle에 전달할 날짜 리터럴의 다른 형식이 있습니까? 아니면 다른 솔루션이 있습니까?오라클 링크 생성에 사용된 매개 변수와 관련이 있는지도 궁금했습니다.참고로 다음과 같습니다.
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 원격 조회에서 로컬이 아닌 원격으로 필터링
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
thx에서 lad2025까지 "완전한" ISO 8601을 추가하고 싶습니다. 이 ISO 8601은 정상적으로 작동합니다.
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
@lad2025에서 제안한 대로 전체 ISO 8601 형식을 사용할 것을 권장합니다.
'2017-10-06T14:57:23'
이는 @Shnugo에서 제안한 ODBC 형식보다 우수합니다.
적어도 SQL Server 2014에서는 1753-01-01 이전 날짜(예: 이전 DATTIME 데이터 유형의 범위를 벗어난 날짜)에 대해 ODBC 형식이 작동하지 않지만 ISO 8601 형식은 작동합니다.
직접 테스트하려면 다음 쿼리를 사용해 보십시오.
--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년 이전이 될 것이라고 생각하지 않더라도, 그것은 좋은 습관입니다.쿼리에서 참조할 일정표를 설정하는 중에 이 문제를 발견했습니다.
쿼리가 Oracle 데이터베이스에서 실행 중인 경우 고정 형식 YYYY-MM-DD를 사용하는 ANSI 날짜 리터럴을 사용하는 것이 좋습니다.
예를들면,
DATE '2015-10-20'
오라클에서는'20140701'
날짜가 아닌 문자열입니다.암묵적인 데이터 유형 변환을 보고 클라이언트의 로케일별 NLS 설정을 기반으로 결과를 얻을 수 있습니다.항상 사용하지 말고 날짜 비교를 위해 문자열을 날짜로 명시적으로 변환해야 합니다.
언급URL : https://stackoverflow.com/questions/33228765/how-do-i-specify-date-literal-when-writing-sql-query-from-sql-server-that-is-lin
'programing' 카테고리의 다른 글
인터페이스 빌더에서 UIView 경계 속성을 설정할 수 있습니까? (0) | 2023.06.20 |
---|---|
패턴에 따라 부분 문자열 추출 (0) | 2023.06.20 |
캐시를 비우고 모든 대상 Xcode 4 이상을 정리하는 방법 (0) | 2023.06.20 |
mongodb: 집계 명령의 실행 시간을 어떻게 볼 수 있습니까? (0) | 2023.06.20 |
표의 총 열 수를 sql로 가져오는 방법 (0) | 2023.06.20 |