Почему это вызывает арифметицепсировать в C #, когда SQLPLUS все в порядке
-
30-09-2019 - |
Вопрос
У меня есть вид, соединяющий 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», чтобы определить нет. дней.