【问题标题】:Time difference based on Sundays in PostgreSQLPostgreSQL 中基于星期日的时差
【发布时间】:2020-05-22 21:11:27
【问题描述】:

我有下表:

CREATE TABLE my_table 
(
    the_debt_id varchar(6) NOT NULL, 
    the_debt_paid timestamp NOT NULL, 
    the_debt_due date NOT NULL
)

INSERT INTO my_table
VALUES ('LMUS01', '2019-05-03 09:00:01', '2019-05-02'), 
       ('LMUS01', '2019-06-03 10:45:12', '2019-06-02'), 
       ('LMUS01', '2019-07-01 15:39:58', '2019-07-02'), 
       ('LMUS02', '2019-05-03 19:43:44', '2019-05-07'), 
       ('LMUS02', '2019-06-07 08:37:05', '2019-06-07')

我想要日期差异,但某些付款日期the_debt_due 落在星期日(例如 6 月 7 日)。如果付款日是星期天,我想给the_debt_due加1,所以好的付款人的差是0或负数(预付)。

结果应该如下:

SELECT (date(the_debt_paid) - the_debt_due) AS date_diff 
FROM my_table

但我不知道如何判断上一个查询是星期天是星期天。

预期输出

date_diff
1
0
-1
-4
0

请注意,第二行是 0,因为截止日期是星期日。

任何帮助将不胜感激。

【问题讨论】:

  • 正如我之前解释的那样:extract(day from ..)给你以天为单位的间隔长度。
  • 你好@a_horse_with_no_name,我将我的问题编辑为正确的天数。谢谢!

标签: sql postgresql date select


【解决方案1】:

您可以使用 (extract dow from ...) 获取给定日期的星期几,其中星期日是第 0 天。

这会做你想做的:

select 
    t.*, 
    date(the_debt_paid) 
        - the_debt_due 
        - (extract(dow from the_debt_due) = 0)::int AS date_diff 
from my_table t

Demo on DB Fiddle

the_debt_id | the_debt_paid | the_debt_due |日期差异 :------------ | :----------------- | :----------- | --------: LMUS01 | 2019-05-03 09:00:01 | 2019-05-02 | 1 LMUS01 | 2019-06-03 10:45:12 | 2019-06-02 | 0 LMUS01 | 2019-07-01 15:39:58 | 2019-07-02 | -1 LMUS02 | 2019-05-03 19:43:44 | 2019-05-07 | -4 LMUS02 | 2019-06-07 08:37:05 | 2019-06-07 | 0

【讨论】:

  • 你好@GMB,你知道这是一个很好的答案!,只是一个问题,当你申请(extract(dow from the_debt_due) = 0)时,它是作为一个逻辑表达式进行评估吗?我的意思是,如果表达式为真,则返回 1?
  • @Manu:是的。条件返回一个布尔值,然后我们将其转换为inttrue 变为 1false 变为 `0。
  • 非常感谢@GMB!我已经测试了周六和周日,并以一种很棒的方式工作!这让我进行了更多调查,感谢您的时间和回答。祝你有美好的一天!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-10-26
  • 2012-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-27
  • 1970-01-01
相关资源
最近更新 更多