C语言日历代码(日历代码实现)

前天我们通过一段代码展示了如何通过Python的Pandas包生成一个日历表,如果各位感兴趣可以参考:通过Pandas生成日历表; 不得不说在DBEngine(https://db-engines.com/en/ranking)排行榜中,PostgreSQL最近几年一直都很稳定,并且在各个云平台中都有非常成熟的PaaS产品供各个企业应用,那么我们今天的目标就是演示一下如何通过#postgresql…

前一天大家经过一段编码展现了怎么根据Python的Pandas包生成一个日历表,假如诸位有兴趣可以参照:根据Pandas生成日历表;

不得不说在 DB Engine(
https://db-engines.com/en/ranking)排名榜中,PostgreSQL最近几年一直都很平稳,而且在每个云服务平台里都有十分完善的PaaS商品供每个公司使用,那麼大家现在的目的便是演试一下怎样根据#postgresql#来生成相近的日历表。

文中采用的PostgreSQL版本号为14.1,Windows Server 2016自然环境下运作。用PostgreSQL生成日历表(Calendar Table)

DB Engine Ranking


一些主要的作用

GENERATE_SERIES

在进行解决方法以前,大家先掌握PostgreSQL的一个函数公式:“GENERATE_SERIES”,根据字面意思应当能大概猜到,这一函数公式可以生成一个序列的数据信息,直接讲便是生成列项的一个数据分析表。

大家先根据psql指令获得针对此函数公式的叙述,如下图所示:用PostgreSQL生成日历表(Calendar Table)

GENERATE_SERIES Description in psql

此函数公式关键有几个特性:

  1. 可以返回整形(bigint,int),浮点数类型(numeric)序列;
  2. 可以返回带时区时间的时间格式类型(timestamp)序列;
  3. 可以返回没有时区时间的时间格式类型(timestamp)序列;

简易举例说明:

1.1 返回整形序列

  • 当特定起点,终点站主要参数
SELECT GENERATE_SERIES(1, 10);

結果如下所示所显示:用PostgreSQL生成日历表(Calendar Table)

返回整形序列

  • 当特定起点,终点站,步幅主要参数

步幅可以解释为弹跳值,从1逐渐,假如步幅为2,那麼下一个数据应该是1 2 = 3,依此类推;

SELECT GENERATE_SERIES(1, 10, 2);

用PostgreSQL生成日历表(Calendar Table)

返回整形序列,特定步幅

1.2 返回浮点数类型序列

此作用类似返回整形序列,不同之处是传到的可以是带小数位的浮点数类型数据信息,如下图所示:

SELECT GENERATE_SERIES(1.1, 10.9, 0.5);

用PostgreSQL生成日历表(Calendar Table)

返回浮点数类型序列,特定步幅

1.3 返回时间格式(timestamp)序列

此功用可以根据特定起点,终点站和步幅三个主要参数,返回一段时间戳的序列数据信息,如下图所示:

SELECT GENERATE_SERIES(\'2022-01-01\'::TIMESTAMP, \'2022-01-31\'::TIMESTAMP, \'1 DAY\') AS datum;

用PostgreSQL生成日历表(Calendar Table)

返回时间格式序列

必须留意的是:

  • 务必与此同时特定三个主要参数,起点,终点站,步幅;
  • 起点和终点站主要参数,务必是时间格式类型(timestamp),假如传到的是日期类型,必须表明变换;
  • 步幅可以是钟头,分鐘,秒,天,礼拜,年等;

日期类型数据信息实际操作

大家必须记牢这一个实际操作:日期 整数金额 = 日期,如下边事例所显示:

date   integer → date
Add a number of days to a date
date \'2022-01-09\'   5 → 2022-01-14

用PostgreSQL生成日历表(Calendar Table)

Case 1: 当月测算用PostgreSQL生成日历表(Calendar Table)

Case 2: 跨月计算

下边大家融合GENERATE_SERIES 函数公式完成怎样获得一个日期类型的序列;

起点:2022-01-01, 终点站:2022-01-31;这两个时间点正中间间距了30天,根据编码完成如下所示:

SELECT \'2022-01-01\'::DATE   s.a AS datum
FROM GENERATE_SERIES(0, 30) AS s(a);

結果如下图所示:用PostgreSQL生成日历表(Calendar Table)

根据GENERATE_SERIES函数公式返回日期类型序列

这类计划方案的优点是:

  1. 返回日期类型序列,原函数仅适用传到时间格式类型数据信息;
  2. 不用按日期時间的Interval特定间隔时间,将时间间隔默认设置为1天。

自定义函数

根据以上的训练,大家已经可以根据传到逐渐日期和间距日数获得大家需要的結果。但是假如业务流程上常常转换逐渐日期和间隔时间,大家还要持续的重新写过SQL句子。为了防止再次改变SQL句子,大家将界定一个函数公式“get_calendar”,并将“逐渐日期”(start_dt)和“间隔时间”(days)作为主要参数传到,进而使人们的效果和句子更为灵便。

编码如下所示所显示:

CREATE OR REPLACE FUNCTION public.get_calendar(
	start_dt date,
	days integer)
    RETURNS TABLE(datum date) 
    LANGUAGE \'sql\'
AS $BODY$

SELECT start_dt   s.a AS datum
FROM GENERATE_SERIES(0, days) AS s(a)
GROUP BY s.a
ORDER BY 1;

$BODY$;

简易测试一下,仍然将‘2022-01-01’做为逐渐日期,间隔时间设定为30天:

SELECT * FROM get_calendar(\'2022-01-01\', 30);

用PostgreSQL生成日历表(Calendar Table)

自定义函数让编码更为灵便


详细编码完成

最后,大家将根据PostgreSQL的很多日期和字符串数组变换函数公式,拓展人们的自定义函数“get_calendar”,获得一个完全的日历表,实际编码如下所示所显示。

/* Author: Derek Zhu
Date: 2022-01-08
Purpose: Calendar table practice in PostgreSQL 14.1
Description:
    Start date: 2022-01-01
    Set days length in 2nd argument of \'Genarate_series\' function */

-- FUNCTION: public.get_calendar(date, integer)

-- DROP FUNCTION IF EXISTS public.get_calendar(date, integer);

CREATE OR REPLACE FUNCTION public.get_calendar(
	start_dt date,
	days integer)
    RETURNS TABLE(datum date, year numeric, month numeric, day_of_month numeric, week_of_year numeric, iso_day_of_week numeric, year_calendar_week text, day_of_year numeric, quarter_of_year numeric, quartal text, year_quartal text, day_name text, month_name text, year_month text, year_half integer, leap_year boolean, weekend text, cw_start date, cw_end date, month_start date, month_end date) 
    LANGUAGE \'sql\'
    COST 100
    VOLATILE PARALLEL UNSAFE
    ROWS 1000

AS $BODY$

SELECT
  datum,
  EXTRACT(YEAR FROM datum) AS \"year\",
  EXTRACT(MONTH FROM datum) AS \"month\",
  EXTRACT(DAY FROM datum) AS day_of_month,
  EXTRACT(WEEK FROM datum) AS week_of_year,
  -- ISO 8601 day of the week numbering, The day of the week as Monday (1) to Sunday (7)
  EXTRACT(ISODOW FROM datum) AS iso_day_of_week,
  -- Standard Gregorian day of the week numbering, The day of the week as Sunday (0) to Saturday (6)
  -- EXTRACT(DOW FROM datum) AS day_of_week,
  -- ISO calendar year and week
  TO_CHAR(datum, \'iyyy/IW\') AS year_calendar_week,
  EXTRACT(DOY FROM datum) AS day_of_year,
  EXTRACT(QUARTER FROM datum) AS quarter_of_year,
  \'Q\' || TO_CHAR(datum, \'Q\') AS quartal,
  TO_CHAR(datum, \'yyyy/\"Q\"Q\') AS year_quartal,
  TO_CHAR(datum, \'TMDay\') AS day_name,
  TO_CHAR(datum, \'TMMonth\') AS month_name,
  TO_CHAR(datum, \'yyyy/mm\') AS year_month,
  -- Half year
  CASE WHEN EXTRACT(MONTH FROM datum) < 7 THEN 1 ELSE 2 END AS year_half,
  -- Leap year
  CASE WHEN EXTRACT(YEAR FROM datum) % 4 = 0 THEN TRUE ELSE FALSE END AS leap_year,
  -- Weekend
  CASE WHEN EXTRACT(ISODOW FROM datum) in (6, 7) THEN \'Weekend\' ELSE \'Weekday\' END AS weekend,
  -- ISO start and end of the week of this date
  datum   (1 - EXTRACT(ISODOW FROM datum))::integer AS cw_start,
  datum   (7 - EXTRACT(ISODOW FROM datum))::integer AS cw_end,
  -- Start and end of the month of this date
  datum   (1 - EXTRACT(DAY FROM datum))::integer AS month_start,
  ((datum   (1 - EXTRACT(DAY FROM datum))::integer   \'1 month\'::interval)::date - \'1 day\'::interval)::DATE AS month_end
FROM (
	SELECT start_dt   s.a AS datum
FROM GENERATE_SERIES(0, days) AS s(a)
GROUP BY s.a
) AS calendar
ORDER BY 1;

$BODY$;

ALTER FUNCTION public.get_calendar(date, integer)
    OWNER TO postgres;

获得2022年全年度日历,如下所示所显示:

SELECT * FROM get_calendar(\'2022-01-01\', 364);

用PostgreSQL生成日历表(Calendar Table)

2022 Calendar Table

根据文本编辑观查結果,如下所示所显示:用PostgreSQL生成日历表(Calendar Table)

Calendar data in csv

根据Excel观查結果,如下所示所显示:用PostgreSQL生成日历表(Calendar Table)

Calendar data in excel

至此,大家已经完成了全部作用;


汇总

根据PostgreSQL转化成日历表关键有下边好多个特别注意点:

  1. ISO8601规范中,一个星期的时间为:Monday (1) ~ Sunday (7);
  2. 了解并灵巧运用GENERATE_SERIES函数公式转化成日期编码序列;
  3. 培养模块化设计思维模式,将常用的数据信息实际操作抽象化为函数公式或方式,可以拓展运用范畴;

与前日根据Python Pandas的例子一样,大家最后也将解决方法抽象化为一个函数公式,供中后期灵便启用,尽管传到的主要参数和最后的結果不完全一致,可是总体策略是相似的。

想对自己说的话

PostgreSQL 现阶段在许多公司都是在很多应用,根据PG群集构建数据库管理服务平台也是许多公司近几年来在尽力做的完成,去IOE早就实行很多年,应用开源项目更换商业手机软件也是必然趋势,PG应当被关注起來,针对PG的一些普遍和主要的实际操作,也需要应当记熟我心。

对于MySQL和PG选哪个这类神仙打架的事儿,真没空想那么多,纯开源系统,或是PG吧~

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

(0)
上一篇 2022年5月8日 下午12:36
下一篇 2022年5月8日 下午12:38

相关推荐

  • 网络推广工具有哪些,16个常用网络推广工具

    本文整理了营销推广必备网站&工具,帮助大家更好的做营销。主要涉及两个方面,第一个营销推广工具:引流渠道+编辑器+html制作+数据分析+运营助手+手机建站;第二个是营销推广信息发布平台:论坛类+博客类+科技类网站+文库类+自媒体平台+社交平台。 01引流渠道 新浪微博:http://weibo.com 搜狐媒体:http://mp.sohu.com 凤凰媒体:http://zmt.ifen…

    2022年5月22日
    1690
  • 华为荣耀magicbook锐龙怎么样(荣耀MagicBook锐龙版全面升级)

    7月16日下午,荣耀正式发布荣耀MagicBook锐龙版。该产品全系配备最新款7nm移动端锐龙处理器,标配65W超级闪充,采用电源指纹合二为一的开机方式,整体配置相当亮眼。 荣耀总裁赵明今天带来了全新的荣耀MagicBook锐龙版系列,其中包括MagicBook14/15/Pro锐龙版三款产品。赵明表示,荣耀MagicBook是为年轻人准备的全屏生产力工具,多样化的屏幕配置能够年轻人带来更自由的选…

    2022年10月18日
    420
  • 创业板ipo排队到上市需要多久,2019创业板ipo上市的要求

    最近一个月来,6家上会审核的创业板拟上市企业全部闯关失败了。 7月25日,上海艾融软件股份有限公司在今年第90次发审会上铩羽而归,无缘创业板,这已经是近期连续第6个被否的创业板拟上市企业。有投行人士认为,这或许是因为当前正值7月,因此发审委近期集中推进一批项目的审核,以免更多企业需要在不久之后补充半年报资料。 今年以来,已有30家创业板企业上会接受发审委考验,但仅有20家成功过会,通过率为66.6…

    2022年6月16日
    710
  • 机房服务器是什么样子的,简述其作用及使用寿命

    众所周知,机房是服务器托管商的重要资源,选择一家靠谱的服务器托管商就必须要对IDC其机房进行考察和参观,今天与大家一起认识下机房必备的服务器保障要求,让大家在进行机房考察时,知道哪些才是机房的重点。 一、服务器的定义和作用如下: 1、服务器是一种高性能计算机,作为网络的节点,存储、处理网络上80%的数据、信息,因此也被称为网络的灵魂。 2、也可以这样讲,服务器指一个管理资源并为用户提供服务的计算机…

    2022年8月10日
    790
  • 怎么恢复u盘删除的文件并且不收费,u盘数据快速恢复方法

    U盘作为我们最常用的文件存储工具,我相信每个人都应该会随身携带一个U盘,以便于我们存储重要的文件。U盘虽然小巧,但是存储的内存并不是非常大,因此我们在使用U盘的时候,通过会将U盘里面不需要的文件删除,可是如果我们在误删文件的时候发生了误删该怎么办?u盘误删的文件怎么恢复? 当我们U盘发生了误删的情况,那么小编推荐大家使用互盾数据恢复软件恢复U盘里删除的文件。这款软件拥有非常强大的扫描系统,能够有效…

    2022年6月11日
    860
  • 自己贴膜教程(新手自己贴钢化膜的技巧)

    想写一篇贴膜的教程,虽然现在某宝上贴膜泛滥,也有一些商家会教你怎么贴膜,但是教程都很马虎,送的什么贴膜神器之类的东西,很是没用,首先就要提一下,那个东西最好少用,因为把手机插入贴膜神器的时候,不排除周围会有灰尘,贴膜贴上去的时候同样担心有灰尘,而毁掉贴膜唯一的理由就是:灰尘! 今天的目的就是教大家怎样尽量完美的贴一张膜,看清楚是尽量,尽量,尽量,以防某些钻牛角尖的让我去无尘车间。 首先准备的工具,…

    2022年5月9日
    960
  • 什么是社交新零售模式,社交新零售的三大优势介绍

    什么是社交新零售呢? 社交新零售,以社交赋能新零售模式,提升零售效率为目的的企业升级解决方案。社交新零售,是在消费升级时代,企业构建以消费者为中心的先进模式,从而获得竞争优势和效率提升。 产品从品牌方到消费者手中,去掉了繁多的经销商,依托于社交化,相当于只有一级代理,大大降低了新零售价格,直接到达消费者手中。与传统零售定价相比,成本大大降低,真正实现了去中介化的扁平渠道流通,既然消费者得到实惠,又…

    2022年7月6日
    680
  • 怎么做网络推广,18种最有效推广的方式

    网络推广是个很广泛的概念,我认为,可以拆分为以下几点: 第一点:客户需求调研 这个你必须清楚,做推广肯定是要让利益最大化,自己的客户画像、喜好、年纪、出现的场所以及怎么的浏览的习惯,平时习惯用哪些APP,你就可以根据这些筛选平台和产品。进行一些广告的测试 第二点:推广的计划 有了推前期的平台调研以及测试,你就需要搭建一个完整闭环的推广框架。选择什么样的平台,做什么样的广告(信息流、竞价、还是GD以…

    2022年5月28日
    630
  • 开个狗粮加工厂挣钱吗,生产狗粮的成本和利润

    小时候家里养了狗,吃的东西不过是剩饭剩菜,过年了多给几块骨头啃,照样看家护院;现在养宠物,每月的花销不比养孩子少。就因为宠物地位的上升,让很多企业在这个产业里赚到盘满钵满,比如温州佩蒂动物营养科技股份有限公司(下称:佩蒂股份)。 这是一家专做宠物用品的公司,放弃新三板后,准备登陆创业板且已发审过会,即将成为国内首家宠物食品上市公司。 2016年报显示,佩蒂股份总营收达到5.5亿元,净利润8047万…

    2022年9月3日
    820
  • 商务鞋什么品牌好(推荐5款经典必备款式)

    你有没有发现,除了要更多的注意细节外,男装搭配真是比女装简单多了。就拿鞋子来说吧,相比较女鞋的千变万化,一直追求秩序感的男鞋则有一定之规,万变不离其宗。在男鞋领域,所有市面上男士皮鞋的影子基本都可以在五种经典鞋款中找到,它们是一种对男人阳刚,自然和优雅的经典象征。 ➳以下五种鞋款,不管你柜子里鞋多鞋少,它们都必不可少。 ↓↓↓ 第一款:乐福鞋(Loafers) Loafers的原型是挪威渔夫手工制…

    2022年10月20日
    410

发表回复

登录后才能评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信