首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >母版日期字符串验证

母版日期字符串验证
EN

Stack Overflow用户
提问于 2017-10-06 16:22:19
回答 1查看 2.3K关注 0票数 3

我试图检查字符串是否为“YYYYMMDD”的有效日期格式。

我正在使用下面的技巧。但是对于无效的日期字符串,我将得到一个有效的日期结果。

我做错了什么?

代码语言:javascript
复制
SELECT'20019999',CASE WHEN unix_timestamp('20019999','YYYYMMDD')  > 0 THEN  'Good'ELSE 'Bad'END;
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-10-07 12:39:19

首先,您使用了错误的格式。

代码语言:javascript
复制
select  from_unixtime(unix_timestamp())                 as default_format
       ,from_unixtime(unix_timestamp(),'YYYY-MM-DD')    as wrong_format
       ,from_unixtime(unix_timestamp(),'yyyy-MM-dd')    as right_format
;
代码语言:javascript
复制
+----------------------+---------------+---------------+
|    default_format    | wrong_format  | right_format  |
+----------------------+---------------+---------------+
| 2017-10-07 04:13:26  | 2017-10-280   | 2017-10-07    |
+----------------------+---------------+---------------+

第二,日期部件范围没有验证。

如果将“日”部分增加1,则会将其转发到第二天。

代码语言:javascript
复制
with t as (select stack(7,'27','28','29','30','31','32','33') as dy)
select  t.dy
       ,from_unixtime(unix_timestamp(concat('2017-02-',t.dy),'yyyy-MM-dd'),'yyyy-MM-dd') as dt

from    t
;
代码语言:javascript
复制
+-----+-------------+
| dy  |     dt      |
+-----+-------------+
| 27  | 2017-02-27  |
| 28  | 2017-02-28  |
| 29  | 2017-03-01  |
| 30  | 2017-03-02  |
| 31  | 2017-03-03  |
| 32  | 2017-03-04  |
| 33  | 2017-03-05  |
+-----+-------------+

如果将月份部分增加1,它会将您转发到下一个月。

代码语言:javascript
复制
with t as (select stack(5,'10','11','12','13','14') as mn)
select  t.mn
       ,from_unixtime(unix_timestamp(concat('2017-',t.mn,'-01'),'yyyy-MM-dd'),'yyyy-MM-dd') as dt

from    t
;
代码语言:javascript
复制
+-----+-------------+
| mn  |     dt      |
+-----+-------------+
| 10  | 2017-10-01  |
| 11  | 2017-11-01  |
| 12  | 2017-12-01  |
| 13  | 2018-01-01  |
| 14  | 2018-02-01  |
+-----+-------------+

即使使用CAST,验证也只在部件范围上进行,而不是在日期本身进行。

代码语言:javascript
复制
select cast('2010-02-32' as date);
代码语言:javascript
复制
+-------+
|  _c0  |
+-------+
| NULL  |
+-------+
代码语言:javascript
复制
select cast('2010-02-29' as date);
代码语言:javascript
复制
+-------------+
|     _c0     |
+-------------+
| 2010-03-01  |
+-------------+

这里有一种实现目标的方法:

代码语言:javascript
复制
with t as (select '20019999' as dt)
select  dt  
       ,from_unixtime(unix_timestamp(dt,'yyyyMMdd'),'yyyyMMdd') as double_converted_dt    

       ,case 
            when from_unixtime(unix_timestamp(dt,'yyyyMMdd'),'yyyyMMdd')  = dt 
            then 'Good' 
            else 'Bad' 
        end             as dt_status

from    t
;
代码语言:javascript
复制
+-----------+----------------------+------------+
|    dt     | double_converted_dt  | dt_status  |
+-----------+----------------------+------------+
| 20019999  | 20090607             | Bad        |
+-----------+----------------------+------------+
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46610027

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档