У меня есть представление, соединяющее 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)
Когда я делаю a 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. Строка заливки
OverflowException был не обработан пользовательским кодом.
Арифметическая операция привела к переполнению.
Почему это хорошо работает в SQLPlus, но перестало работать в C#?:S
Я считаю, что это связано с типом данных SQL-Number. Вы можете попробовать следующий вариант ..
1) .... Round ((SYSDATE - l.expectedReturnDate), 2) ...
2) Преобразование типа данных «NoOfDaysLate» в целое число.
ЕСЛИ вас интересует лишь какая-то часть разницы между двумя датами, тогда вам следует вместо этого использовать DateDiff ...
Например: DATEDIFF (yy, startDate, endDate) YearsPassedSinceStart
возвращает номер. лет прошло с даты начала.
Аналогично, чтобы найти количество месяцев, используйте "m" в качестве части даты или "d", чтобы определить "нет". дней.