【问题标题】:How to use the current date format in a SQL Query如何在 SQL 查询中使用当前日期格式
【发布时间】:2018-04-03 11:59:49
【问题描述】:

我正在尝试进行查询,以天数计算过期图书馆图书的天数。我还想显示读者的姓氏(借书的人)、书名、图书的到期日。
我运行了一个简单的查询来了解我在寻找什么。我跑的代码如下:

    SELECT PATRON.PAT_LNAME, BOOK.BOOK_TITLE, CHECKOUT.CHECK_DUE_DATE, 
           CHECKOUT.CHECK_IN_DATE 
           FROM CHECKOUT, BOOK, PATRON
           WHERE CHECKOUT.BOOK_NUM=BOOK.BOOK_NUM 
           AND CHECKOUT.PAT_ID= PATRON.PAT_ID
           AND CHECK_IN_DATE IS NULL 

我需要计算图书从到期日算起的逾期天数。我想用当前日期来计算这本书过期的天数,虽然我不知道该怎么做。我知道有一个 SYSDATE 函数可以给出当前日期。我不知道如何使用 SYSDATE 函数。

【问题讨论】:

  • SYSDATE 非常易于使用:您只需在需要的地方写下它的名称(就像这样:SYSDATE)。要计算天数差异,您只需在日期之间加上 - (减号);其中一个可能是您的列名,另一个可能是 SYSDATE。您需要决定要如何处理一天中的时间(预订截止日期为上午 10 点,SYSDATE 目前是下午 2 点 - 您如何处理小数天数?)

标签: sql date oracle11g


【解决方案1】:

我认为过期图书的标记是当前日期大于到期日期。因此,您只需将到期日期与 SYSDATE 进行比较,即可确定哪些书已过期以及过期了多少天。

SELECT
    p.PAT_LNAME,
    b.BOOK_TITLE,
    c.CHECK_DUE_DATE, 
    c.CHECK_IN_DATE,
    SYSDATE - c.CHECK_DUE_DATE AS num_days_due
FROM CHECKOUT c
INNER JOIN BOOK b
    ON c.BOOK_NUM = b.BOOK_NUM
INNER JOIN PATRON p
    ON c.PAT_ID = p.PAT_ID
WHERE
    c.CHECK_IN_DATE IS NULL AND
    SYSDATE > c.CHECK_DUE_DATE;

在 Oracle 中,我们只需减去两个日期即可得到天数差。另请注意,我用显式连接替换了您的隐式内部连接。这是编写连接查询的首选方式。

【讨论】:

  • 这对我有什么帮助(引用原帖并强调):“我需要从到期日计算这本书逾期的天数 。”?听起来像是“这本书过期了多少天?”
  • @mathguy 你关于小数日期的观点仍然有效。虽然我认识一些曾经在公共图书馆工作的人,但我似乎记得逾期费用是按日计费的。
  • 大声笑 - 我错过了 SELECT 子句中的 NUM_DAYS_DUE,我只看到了 WHERE 子句。所以,别介意我的第一条评论。然后:关于到期日和“每日津贴” - 我相信情况也是如此,但是,在到期日结束时,顾客有时间直到午夜归还这本书并“信誉良好”,无论他们何时借了它(一天中的什么时间)。不确定如何处理 SYSDATE 的小数部分以计算罚款...向下舍入还是向上舍入?
  • @mathguy 我有一个解决办法来解决这个问题,我可以说库应该在午夜之后将上述查询作为批处理作业每天运行一次。这样,即使是晚上 11 点 59 分到期的书,到时候仍然会到期。但我同意你在分数天的情况。
猜你喜欢
  • 2012-03-05
  • 2015-03-05
  • 2020-04-02
  • 2012-09-23
  • 2021-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多