postgresql得到时间对应周的周一

两种方法:

第一种:

DO $$
declare d int;
declare d1 varchar(100);
declare d2 varchar(100);
declare d3 date;
declare d4 date;
begin
d3:= CURRENT_DATE;
d1:='select date'''|| d3 ||'''';
d:=(SELECT EXTRACT(DOW FROM d3))-1;
d2:=d1 || '-INTERVAL ''' || d || ' day '' ';
EXECUTE d2 into d4;
RAISE NOTICE 'ok %',d4;
end$$

结果:

[SQL]DO $$
declare d int;
declare d1 varchar(100);
declare d2 varchar(100);
declare d3 date;
declare d4 date;
begin
d3:= CURRENT_DATE;
d1:='select date'''|| d3 ||'''';
d:=(SELECT EXTRACT(DOW FROM d3))-1;
d2:=d1 || '-INTERVAL ''' || d || ' day '' ';
EXECUTE d2 into d4;
RAISE NOTICE 'ok %',d4;
end$$

NOTICE:  ok 2016-06-13

时间: 0.004s

受影响的行: 0

解析:

declare :声明变量
CURRENT_DATE : 得到当前日期

SELECT CURRENT_DATE;

结果:

date
2016-06-12

extract :从时间中抽出相应的字段
DOW 一周里的第几天 (sunday =0 saturday=6)

格式:
EXTRACT(field FROM source)

当前日期是一周里面的第几天

SELECT EXTRACT(DOW FROM CURRENT_DATE);

结果:
date_part
        0

INTERVAL :时间间隔类型
EXECUTE :执行一个准备好的查询
RAISE NOTICE :把结果显示出来

第二种:

SELECT  CURRENT_DATE +cast(-1*(TO_NUMBER(to_char(CURRENT_DATE,'D'),'99')-2) ||' days' as interval);

结果:

column?
2016-06-13 00:00:00

解析:

TO_NUMBER 将一个字符串转换成数字

格式:

TO_NUMBER(string,format) 
-- 一周里的日子(1-7;周日是1)
select to_char(CURRENT_DATE  ,'D')

DDD 一年里的日子(001-366)
DD  一个月里的日子(01-31)
D   一周里的日子(1-7;周日是1)

select to_char (to_date('2016-06-12','yyyy-mm-dd'),'D')

select to_number(‘1.1’,'9.99') from dual;
1.1

select to_number(‘1.121’,'9.99') from dual;

1.12

-- 将得到的字符串转换成数字
select TO_NUMBER(to_char(CURRENT_DATE,'D'),'99')

-- 因为得到的星期一为2,所以要减去2
select TO_NUMBER(to_char(CURRENT_DATE,'D'),'99')-2

-- 将得到的数字乘以 -1  比如例子中:-1*3  就是 -3  ,也就是减去 3select cast(-1*3 || 'days' as interval) 

-- 就是将当天减去0天 得到了星期一的日期
select cast(-1*0 || 'days' as interval) + CURRENT_DATE

SELECT   to_char(CURRENT_DATE +cast(-1*(TO_NUMBER(to_char(CURRENT_DATE,'D'),'99')-2) ||' days' as interval),'yyyy-mm-dd');
  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值