PostgreSQL 当月最后一天的工作日 , 计算日期是星期几

可以用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
版权声明:本文为博主原创文章,转载请附上博文链接!

原文地址:https://www.cnblogs.com/telwanggs/p/11056457.html

时间: 2024-12-29 23:12:05

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

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

1 /** 2 * 日期-获取当月最后一天 3 * @return int 4 */ 5 public function get_lastday() { 6 if($this->month==2) { 7 $lastday = $this->is_leapyear($this->year) ? 29 : 28; 8 } elseif($this->month==4 || $this->month==6 || $this->month==9 || $this->mo

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

取某月天数:select day(dateadd(month,1,'2012-02-01')-1) --当月天数 select day(dateadd(ms,-3,DATEADD(m, DATEDIFF(m,0,getdate())+1,0))) ---当月第一天 select dateadd(d,-day(getdate())+1,getdate()) ---当月最后一天 select dateadd(d,-1,dateadd(m,1,dateadd(d,-day(getdate())+1,g

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

上个月最后一天: $last_month_last_day = date('Y-m-t',strtotime('-1 month')); 当月最后一天: $first_day=date('Y-m-01',time()); $this_month_last_day=date("Y-m-d",strtotime("$first_day +1 month -1 day")); 下月最后一天: $first_day=date('Y-m-01',time()); $next_

sqlserver计算日期

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

计算日期函数

[email protected][email protected]=GETDATE() [email protected][email protected]=3 --1.指定日期该年的第一天或最后一天--A. 年的第一天SELECTCONVERT(char(5),@dt,120)+'1-1' --B. 年的最后一天SELECTCONVERT(char(5),@dt,120)+'12-31' --2.指定日期所在季度的第一天或最后一天--A. 季度的第一天SELECTCONVERT(dateti

一个简单的工作日计算

一个简单的工作日计算: function getWorkDay(dtBegin:TDateTime;IncDays:Integer):TDateTime; const days: array[1..7] of string=('7','1','2','3','4', '5','6'); var week1:string; x:integer; begin //日期 x:=1; while (x<=IncDays) do begin //判断是否周末 week1:=days[DayOfWeek(d

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

ufn_GetWeekFirstAndEndDay    获取指定日期所在星期的第一天和最后一天日期 ALTER FUNCTION [dbo].[ufn_GetWeekFirstAndEndDay](@tmpDate DATETIME)RETURNS  @tmpTable TABLE(            FirstDay DATETIME ,          EndDay DATETIME   )ASBEGIN    INSERT INTO @tmpTable    SELECT a.Fi

获取当前日期时间,获取当月最后一天

获取当前日期: public class TestDate {   public static void main(String[] args) {      Date now = new Date();      Calendar cal = Calendar.getInstance(); } 获取当月最后一天: public static boolean isMonthEnd(Date date) { Calendar calendar = Calendar.getInstance(); c

计算日期

#include<iostream> using namespace std; int Monthday[12]={31,28,31,30,31,30,31,31,30,31,30,31}; int main() { int N; cin>>N; while(N--) { int year,month,day; cin>>year>>month>>day; int result=0; for(int i=0;i<=month-2;i++)