1

我有一个连接 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)

当我做 aSELECT * 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。
算术运算导致溢出。

为什么它在 SQLPlus 中运行良好但在 C# 中失败?:S

4

2 回答 2

1

我相信它与 SQL-Number 数据类型有关。您可以尝试以下选项..

1) .... Round((SYSDATE - l.expectedReturnDate),2 ) ...

2) 将“NoOfDaysLate”的数据类型转换为整数。

于 2010-06-26T09:25:40.173 回答
1

如果您只是对两个日期之间差异的某些部分感兴趣,那么您应该改用 DateDiff ...

例如: DATEDIFF(yy, startDate, endDate) YearsPassedSinceStart

返回编号。自开始日期以来经过的年数。

与查找月数类似,使用“m”作为日期部分或使用“d”来确定否。天。

于 2010-06-26T09:33:24.320 回答