Presto 时间、日期及计算相关日期

由于工作中在数据迁移,大数据平台数据查询引擎使用Presto,和传统的数据库时间函数有区别,整理一版,供大家参考,一起学习,有错误欢迎指正。

1、查询当前日期
    select current_date;
2、查询当前时间
    select current_timestamp;
                 _col0                 
    ---------------------------------------
     2022-01-02 20:45:58.551 Asia/Shanghai
3、求当前时区
    select current_timezone( );
             _col0          
        ---------------
         Asia/Shanghai
4、将字符串转为日期
    select date('2021-05-31');
5、将UNIX时戳转换为时间戳:from_unixtime(unixtime) → timestamp
    select FROM_UNIXTIME(1475996660);
              _col0          
    -------------------------
    2016-10-09 15:04:20.000
6、将UNIX时戳转换成时戳变量.可以带时区选项:from_unixtime(unixtime, string) → timestamp with time zone
    select from_unixtime(1617256617000/1000,'Asia/Shanghai')
                     _col0                     
    ---------------------------------------
     2021-04-01 13:56:57.000 Asia/Shanghai 
7、每月1号零时
    select date_trunc('month',now());
                     _col0                 
        ---------------------------------------
         2022-01-01 00:00:00.000 Asia/Shanghai 
8、每月1号
    select date_trunc('month',current_date);
           _col0    
        ------------
         2022-01-01 
9、每月15号9点30分
    select date_trunc('month',now()) + interval '15' day + interval '9' hour + interval '30' minute;
                 _col0                 
    ---------------------------------------
     2022-01-16 09:30:00.000 Asia/Shanghai
10、每天零时
    select to_char(date_trunc('day',now()),'yyyy-mm-dd hh:mi:ss');
            _col0        
    ---------------------
     2022-01-03 00:00:00
11、求每周一是哪天
    select date_trunc('week',now());
                     _col0                 
    ---------------------------------------
     2022-01-03 00:00:00.000 Asia/Shanghai 
    
    select date_trunc('week',date('2021-12-05'));
       _col0    
    ------------
     2021-11-29 
12、求每小时
    select date_trunc('hour',now());
                     _col0                 
    ---------------------------------------
     2022-01-03 09:00:00.000 Asia/Shanghai 
13、求当前时间截止到分
    select date_trunc('minute',now());
                 _col0                 
    ---------------------------------------
     2022-01-03 09:59:00.000 Asia/Shanghai 
14、求当前时间
    select to_char(date_trunc('minute',now()),'yyyy-mm-dd hh:mi:ss');
            _col0        
    ---------------------
     2022-01-03 10:02:00
15、求今年第一天
    select date_trunc('year',now());
                     _col0                 
    ---------------------------------------
     2022-01-01 00:00:00.000 Asia/Shanghai 
16、时间格式转换
    例子:当前时间20200110 转化为2020-01-10
    select format_datetime(date_parse('20200110','%Y%m%d'),'yyyy-MM-dd');
17、时间的加减
    select date_add('day',6,date'2021-05-07');
    select date_add('day',6,cast('2021-05-07' as date));
    select date_add('day',7,cast(format_datetime(date_parse('20211223','%Y%m%d'),'yyyy-MM-dd') AS DATE));
    select date_add('day',7,date(format_datetime(date_parse('20211223','%Y%m%d'),'yyyy-MM-dd')));
    月份和年,直接搞day换成相应的month和year
18、时间戳转日期
    select from_unixtime(1589213441);
    修改下格式:
    1、select date(from_unixtime(1589213441));
    2、select format_datetime(from_unixtime(1589213441),'yyyy-MM-dd');
19、日期转换为时间戳
    select to_unixtime(cast('2020-01-10' as date));
    select to_unixtime(cast(format_datetime(date_parse('20211224','%Y%m%d'),'yyyy-MM-dd') as date));
20、计算两个日期之间的天数
    select date_diff('day',date('2021-11-23'),date('2021-12-23'));
21、计算本月第一个天、上月第一天、上月最后一天    
    select date_trunc('month',current_date), --本月第一天
           date_add('month',-1,date_trunc('month',current_date)),--上月月初
           date_add('day',-1,date_trunc('month',current_date)) --上月最后一天
       _col0    |   _col1    |   _col2    
    ------------+------------+------------
     2022-01-01 | 2021-12-01 | 2021-12-31 
22、求求上年年初、去年今天、今年年初、当月月初、当前时间
    select date_trunc('month',date_add('month',-12,current_date)), --求上年年初
           date_add('month',-12,current_date), --去年今天
           date_trunc('year',current_date), --今年年初
           date_trunc('month',current_date), --当月月初
           current_date; --当前时间
关于第16、17的一点小说明:

1、把第16个换成下面的写法:

select format_datetime(date_parse('20200110','%Y%m%d'),'YYYY-MM-DD');

这么写没有问题,可以得到想要的结果:

   _col0    
------------
 2020-01-10 

但是换成下面的形式,就会有问题

select format_datetime(date_parse('20211111','%Y%m%d'),'YYYY-MM-DD');

    _col0    
-------------
 2021-11-315

看到没,2021年11月份有315天,这个原因是:YYYY-MM-DD,建议大家,写日期格式的时候,使用:yyyy-MM-dd,也就是除了月份大写外,其他的全部小写。

2、select date_add('day',7,cast(format_datetime(date_parse('20211111','%Y%m%d'),'YYYY-MM-DD') as date)) ;

这个执行报错,可能看了半天也会觉得没问题,错误如下:

Query 20220103_091408_00107_n5kjc failed: Value cannot be cast to date: 2021-11-315

原因就是第一点说的,日期转换的时候,大写了,换成下面的就可以了:

select date_add('day',7,cast(format_datetime(date_parse('20211111','%Y%m%d'),'yyyy-MM-dd') as date));

   _col0    
------------
 2021-11-18 
————————————————
 

  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Presto SQL中,可以使用一些内置函数来进行日期转换操作。其中常用的函数包括: 1. `current_date`:获取当前日期。 2. `date_add(interval, value, date)`:在指定日期上添加或减去指定的时间间隔。 3. `date_trunc(unit, date)`:将日期截断到指定的单位,例如截断到月份或周。 4. `date_diff(unit, date1, date2)`:计算两个日期之间的差值,返回以指定单位表示的差值。 5. `to_char(date, format)`:将日期时间值转换为指定格式的字符串。 6. `date_parse(string, format)`:将指定格式的日期字符串解析为日期值。 7. `cast(string as date)`:将日期字符串转换为日期值。 例如,要将日期转换为星期几,可以使用`mod`和`date_diff`函数,根据返回的差值来判断星期几。具体示例代码如下: ``` SELECT case mod(date_diff('day', cast('2021-02-01' as date), cast(stringtime_field_name as timestamp) as date), 7) when 0 then '周一' when 1 then '周二' when 2 then '周三' when 3 then '周四' when 4 then '周五' when 5 then '周六' when 6 then '周日' end AS "星期几" FROM "presto_ods"."thexing_ads_itm_analysis" -- 自己的表名 ``` 这段代码将`stringtime_field_name`字段转换为时间戳,并计算日期与指定日期(如'2021-02-01')之间的差值,然后根据差值判断星期几。 需要注意的是,Presto SQL对日期时间的处理需要使用特定的函数和语法,如`cast`和`date_parse`等。同时,具体的日期格式也需要根据实际情况进行调整。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [【presto sql】presto sql 如何通过 计算当前日期(年月日,时分秒) 来计算当前是星期几?](https://blog.csdn.net/qq_43674360/article/details/129120128)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值