Почему это вызывает арифметицепсировать в C #, когда SQLPLUS все в порядке

StackOverflow https://stackoverflow.com/questions/3123308

Вопрос

У меня есть вид, соединяющий 4 таблицы

CREATE VIEW BookCopyInfo 
AS
SELECT
  bc.BookCopyID, b.BookTitle, m.FirstName || ' ' || m.LastName AS BorrowedBy,
  l.expectedReturnDate, (SYSDATE - l.expectedReturnDate) AS NoOfDaysLate
FROM Book b, Member m, Lending l, BookCopy bc
WHERE b.BookID = bc.BookID AND l.MemberID = m.MemberID
  AND l.BookCopyID = bc.BookCopyID

Есть небольшая арифметика дата, который находит, сколько дней было поздно

(SYSDATE - l.expectedReturnDate)

Когда я делаю SELECT * FROM BookCopyInfo, я получаю ряды, как

4  | Human Computer Interaction | Alan Paul | 10-JUL-10  | -13.642292

Так что правильно, а -13 является правильным ответом на самом деле.

DESC BookCopyInfo возвращается

 Name                                      Null?    Type
 ----------------------------------------- -------- ---------------

 BOOKCOPYID                                NOT NULL NUMBER(38)
 BOOKTITLE                                 NOT NULL VARCHAR2(100)
 BORROWEDBY                                         VARCHAR2(126)
 EXPECTEDRETURNDATE                        NOT NULL DATE
 NOOFDAYSLATE                                       NUMBER(38)

Однако в C #

DataTable dtBookInfo = new DataTable();
da = new OracleDataAdapter("SELECT * FROM BookCopyInfo", con);
da.Fill(dtBookInfo);

ловит исключение в линии DA.FILL

OverflowException был необработан пользовательским кодом.
Арифметическая операция привела к переполнению.

Почему он работает нормально в SQLPLU, но не удается в C #? : S.

Это было полезно?

Решение

Я считаю, что он должен с типом данных SQL-номер. Вы можете попробовать следующий вариант ..

1) .... раунд ((Sysdate - L.ExpectedRathurndate), 2) ...

2) Преобразуйте тип данных «NOOFDaySlate» в целое число.

Другие советы

Если вы только заинтересованы в некоторой части разницы между двумя датами, то вам следует использовать датифф вместо этого ...

Например: Datesiff (yy, startdate, enddate) lesspassedsincestart

возвращает нет. прошло прошло с момента начала.

Аналогично найти количество месяцев, используйте «M» как дату даты или «D», чтобы определить нет. дней.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top