2016-11-28 8 views
0

TIMESTAMP(0) WITH TIMEZONE 유형의 열이있는 테이블에 대한 업데이트를 시도하고 있습니다.데이터베이스의 TIME ZONE 값을 사용하여 Oracle TIMESTAMP (0)을 (를) 업데이트하는 적절한 방법

TIMESTAMP이 데이터베이스에 쓰여지는 방식이 미국 동부 표준시의 오프셋 형식 (예 : -05:00)이 아니기 때문에 여러 가지 방법을 시도해 보았습니다. 시간대로 AMERICA/NEW_YORK을 사용하여 저장되었으므로 다른 응용 프로그램에서이 문제를 제대로 처리 할 수 ​​없습니다.

현재 : 28-NOV-16 10.51.43.000000000 AM AMERICA/NEW_YORK

원하는 : 28-NOV-16 10.51.43.000000000 AM -05:00 여기

많은 게시물은 데이터베이스에서 검색있어 데이터의 서식을 주로 이야기; 다른 예제는 C#이 아닌 SqlPlus를 사용하여 설명합니다.

Using(OracleConnection conn = new OracleConnection(......)) 
{ 
     OracleCommand cmd = new OracleCommand(); 
     cmd.Connection = conn; 
     cmd.BindByName = true; 
     cmd.CommandText = "update customer set email_addr = :EMAIL, modified_date= SYSDATE 
    where cust_id = :CUSTID"; 

     conn.Open(); 
     cmd.Parameters.Add("EMAIL", OracleDbType.Varchar2).Value = txtEmail.Text; 
     cmd.Parameters.Add("MODIFIED_DATE", OracleDbType.Varchar2).Value = OracleDate.GetSysDate().ToOracleTimeStamp(); 
     cmd.Parameters.Add("CUSTID", OracleDbType.Decimal).Value =Convert.ToDecimal(Session["ID"]); 

    cmd.ExecuteNonQuery(); 
} 

나는 또한 modified_date=to_timestamp(:modified_date, 'MM/DD/YYYY HH:mi:ss') 시도했지만이 같은하지 올바른 형식의 시간대를 예외를 생성합니다.

C#에서이 작업을 수행하는 적절한 방법은 무엇입니까? 날짜/타임 스탬프 열은 항상 문자열의 변환으로 작성해야합니까?

답변

1

코드에 오타가있는 것처럼 보입니다. 2 개의 바인드 변수를 지정했지만 3 개의 값을 바인드하려고했습니다. 이 TimeStampTZ을해야합니다

OracleCommand cmd = new OracleCommand(); 
cmd.Connection = conn; 
cmd.BindByName = true; 
cmd.CommandText = "update customer set email_addr = :EMAIL, modified_date= :MODIFIED_DATE 
where cust_id = :CUSTID"; 

conn.Open(); 
cmd.Parameters.Add("EMAIL", OracleDbType.Varchar2).Value = txtEmail.Text; 
cmd.Parameters.Add("MODIFIED_DATE", OracleDbType.TimeStampTZ).Value = OracleDate.GetSysDate().ToOracleTimeStamp(); 
cmd.Parameters.Add("CUSTID", OracleDbType.Decimal).Value =Convert.ToDecimal(Session["ID"]); 
cmd.ExecuteNonQuery(); 

OracleDbTypeVarchar2 없습니다.

그러나 DevArt의 Oracle Data Provider를 사용하고있는 것으로 보입니다. documentation을 확인하면 데이터 유형 TIMESTAMP WITH TIME ZONE을 지원하지 않는 것처럼 보입니다.

몇 가지 해결 방법이 있습니다.

설정하여 SESSIONTIMEZONE이 예를 들어, 데이터베이스에 작업을 실행하기 전에 -05:00에 : 현재 시간

OracleCommand cmd = new OracleCommand(); 
cmd.Connection = conn; 
cmd.BindByName = true; 
cmd.CommandText = "update customer set email_addr = :EMAIL, modified_date= CURRENT_TIMESTAMP 
where cust_id = :CUSTID"; 

conn.Open(); 
cmd.Parameters.Add("EMAIL", OracleDbType.Varchar2).Value = txtEmail.Text; 
cmd.Parameters.Add("CUSTID", OracleDbType.Decimal).Value =Convert.ToDecimal(Session["ID"]); 
cmd.ExecuteNonQuery(); 

CURRENT_TIMESTAMP 반환 :

cmd.CommandText = "ALTER SESSION SET TIME_ZONE = '-05:00'"; 
cmd.ExecuteNonQuery(); 

그런 다음 C# 코드는 다음과 같이 될 수 있습니다 세션 시간대는 TIMESTAMP WITH TIME ZONE 데이터 형식입니다.

또한 예를 들어, SQL에 시간대를 지정할 수 있습니다 : 당신이 시간대 -05:00를 사용 TIMESTAMP WITH TIME ZONE에 암시 적 캐스트를 만들 것입니다 TIMESTAMP 오라클과 TIMESTAMP WITH TIME ZONE 값을 업데이트

cmd.CommandText = "update customer set email_addr = :EMAIL, 
     modified_date= SYSTIMESTAMP AT TIME ZONE '-05:00' 
    where cust_id = :CUSTID"; 

.

은 미국/뉴욕은 이러한 명령은보다 역동적하고 일년에 두 번 -05:00-04:00 사이를 전환해야한다, 즉 일광 절약 시간을 가지고 (당신이 America/New_York 같은 시간대 영역을 사용한다면 그것은 큰 BEFIT가 될 것입니다) .

AMERICA/NEW_YORK과 같은 표준 시간대 이름을 처리 할 수없는 응용 프로그램에서 ALTER SESSION SET NLS_TIMESTAMP_TZ_FORMAT = 'DD-MON-YY HH.MI:SS.FF AM TZH:TZM'을 실행할 수도 있습니다.

+0

이것은 정확히 내가 필요로하는 것이었고 세션 매개 변수를 설정하는 또 다른 질문에 대한 대답입니다. 고맙습니다! BTW 내가 SYSTIMESTAMP를 사용할 때 정확한 시간대를 자동으로 얻을 수 있으므로 실제로'AT TIME ZONE'을 사용할 필요가 없습니다. 다시 감사합니다. – Mobilemike