可以用pg自带函数select extract(dow from current_date),之所以没用主要是展示一下通过数学方法计算日期的原理.

drop function if exists getDateWeek(date);
drop function if exists intervalDay(date);
drop function if exists getMonMaxDay(integer,integer);
drop function if exists getMonMaxDate(integer,integer);
/****************************************************************************************
判断年份是闰年还是平年
drop function if exists isleap(integer);
select isleap(2018);
****************************************************************************************/
create or replace function isleap(integer)
returns boolean
as $$
select (($1 % 4) = 0 and (($1 % 100) <> 0 or ($1 % 400) = 0))
$$ language sql immutable strict;
/****************************************************************************************
根据年度和月份获取本月的最后一天
drop function if exists getDateWeek(integer,integer);
drop function if exists getMonMaxDate(integer,integer);
select getMonMaxDay(2018,8);
select getMonMaxDate(2018,8);
****************************************************************************************/
create or replace function getMonMaxDay(iyear integer,imonth integer)
returns integer
as $$
select
(case when 2=$2 then
(case when isleap($1) then
29
else
28
end)
when 4=$2 or 6=$2 or 9=$2 or 11=$2 then
30
else
31
end)
$$ language sql immutable strict;

create or replace function getMonMaxDate(iyear integer,imonth integer)
returns date
as $$
select make_date( iyear,imonth,
(case when 2=$2 then
(case when isleap($1) then
29
else
28
end)
when 4=$2 or 6=$2 or 9=$2 or 11=$2 then
30
else
31
end));
$$ language sql immutable strict;

/****************************************************************************************
与1970-1-1间隔多少天
drop function if exists intervalDay(date);
select intervalDay(current_date);
****************************************************************************************/
create or replace function intervalDay(date)
returns integer
as $$
select (extract(epoch from $1) / 86400)::integer;
$$ language sql immutable strict;
/****************************************************************************************
获取日期是星期几
1970-1-1是星期4
返回结果中的0表示星期天
drop function if exists getDateWeek(date);
select getMonLastDayWeek('2019-08-1'::date);
****************************************************************************************/
create or replace function getDateWeek(date)
returns integer
as $$
with cte as (
select ( ( 4 + intervalDay($1) ) % 7 ) as val
) select ( case when val < 0 then
7+val
else
val
end)
from cte
$$ language sql immutable strict;

使用方法

--检查函数是否正确
with cte as(
select to_timestamp(val*86400) as dt from generate_series(-100,100) as val
)select getDateWeek(dt::date),dt from cte;

--获取2017年6月的最后一天是星期几
select getDateWeek(getMonMaxDate(2017,6));
---------------------
作者:kmblack1
来源:CSDN
原文:https://blog.csdn.net/kmblack1/article/details/82414602
版权声明:本文为博主原创文章,转载请附上博文链接!

PostgreSQL 当月最后一天的工作日 , 计算日期是星期几的更多相关文章

  1. JS获取当年当月最后一天日期

    <html xmlns="http://www.w3.org/1999/xhtml" > <meta charset="UTF-8"> ...

  2. 使用SQL语句查询日期(当月天数,当月第一天,当月最后一天,本年最后一天,当月第一个星期) 日期转字符串

    取某月天数:,) --当月天数 ,DATEADD(m, DATEDIFF(m,,getdate())+,))) ---当月第一天 ,getdate()) ---当月最后一天 ,dateadd(m,,d ...

  3. php 日期 - 获取当月最后一天

    /** * 日期-获取当月最后一天 * @return int */ public function get_lastday() { if($this->month==2) { $lastday ...

  4. PHP计算上一个月最后一天、当月最后一天、下一个月最后一天

    上个月最后一天: $last_month_last_day = date('Y-m-t',strtotime('-1 month')); 当月最后一天: $first_day=date('Y-m-01 ...

  5. sqlserver计算日期

    在网上找到的一篇文章,相当不错哦O(∩_∩)O~ 这是计算一个月第一天的SQL 脚本:  SELECT DATEADD(mm, DATEDIFF(mm,0,getdate()), 0) --当月的第一 ...

  6. ThinkPHP 获取指定日期后第N个工作日具体日期

    思路: 1.获取到查询年份内所有工作日数据数组2.获取到查询开始日期在工作日的索引3.计算需查询日期索引4.获得查询日期 /*创建日期类型记录表格*/ CREATE TABLE `tb_workday ...

  7. mysql上月最后一天,当月最后一天

    select last_day(DATE_SUB(now(),INTERVAL 1 MONTH)) #上月最后一天日期 %Y-%m-%d select last_day(curdate()) #当月最 ...

  8. 计算日期时间 自动加1天 PHP计算闰年 java与PHP时间戳对比区别

    昨天写一个同步数据库的模块  从一个数据库同步到另外一个数据库,因为数据较多,不可能一次性全部搬迁过去,所以就按照每天搬迁! 写了一个 模块,点击加1,只要点击一次,自动从A数据库取出1天的数据, 并 ...

  9. MSSQL 获取指定日期所在星期的第一天和最后一天日期 获取指定日期坐在月的第一天和最后一天

    ufn_GetWeekFirstAndEndDay    获取指定日期所在星期的第一天和最后一天日期 ALTER FUNCTION [dbo].[ufn_GetWeekFirstAndEndDay]( ...

随机推荐

  1. h5学习之表单

    <html> <head> <title>新型input类型及表单新元素</title> <meta charset="utf-8&qu ...

  2. 深入JavaScript对象(Object)与类(class),详细了解类、原型

    JavaScript基于原型的对象机制 JavaScript原型上的哪些事 一.JavaScript基于原型的对象机制 JavaScript对象是基于原型的面向对象机制.在一定程度上js基于原型的对象 ...

  3. SQL学习——SELECT INTO和INSERT INTO SELECT

    原文链接 SELECT INTO 作用 SELECT INTO 语句从一个表中复制数据,然后将数据插入到另一个新表中. SELECT INTO 语法 我们可以把所有的列都复制到新表中: SELECT ...

  4. 1.IOC原理模拟

    Spring两大核心功能,IOC(Inverse  of  Control)  和 AOP(Aspect-Oriented-Programming) IOC原理模拟: 有这样一个beans.xml: ...

  5. Linux 虚拟机扩容

    由于在装软件,原来的20G空间不够使用,需要扩容操作. 1.关闭虚拟机 2.点击编辑虚拟机设置 选中硬盘,添加,硬盘,推荐,确定大小,完成. 2.启动虚拟机 查看磁盘使用情况: [root@maste ...

  6. paypal支付 NVP支付 paypal 手续费 GetTransactionDetails

    主要内容: 本文章主要讲解的是NVP的对接,以最简单的接口案例,讲解一下对接NVP的方案. 先提供下paypal 官方文档的主要功能对接说明,如下 1.请求API 服务器端点 描述 https://a ...

  7. .net 调用 winapi获取窗口句柄和内容

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  8. 【Day3】2.re模块使用案例

    课程目标 1.提取 2.匹配 3.替换 1.提取 import re ret = re.findall([正则表达式]) # 返回的类型是列表 2.匹配 import re ret = re.matc ...

  9. matlab FDA

    FDA是filter design analysis过滤器设计与分析的缩写.

  10. IDEA设置CodeGlance颜色

    CodeGlance是IDEA的mini地图插件, 默认情况下, 其颜色和编辑框的颜色基本一致, 而安装CodeGlance就是为了方便滚动框的上下拖拉, 颜色一致的话会将这种CodeGlance比拖 ...