ITPUB论坛-中国最专业的IT技术社区

 手机号登录  找回密码
 注册
查看: 1070|回复: 4

[每日一题] PL/SQL Challenge 每日一题:2018-3-31 日期型数据

[复制链接]
论坛徽章:
486
秀才
日期:2015-09-09 10:33:01秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12状元
日期:2015-11-23 10:04:09举人
日期:2015-11-23 10:04:09秀才
日期:2016-01-06 14:10:21秀才
日期:2016-01-06 14:10:21秀才
日期:2016-01-06 14:10:21秀才
日期:2016-01-06 14:10:21秀才
日期:2016-01-06 14:10:21
发表于 2018-4-10 04:52 | 显示全部楼层 |阅读模式
最先答对且答案未经编辑的puber将获得纪念章一枚(答案不可编辑但可发新贴补充或纠正),其他会员如果提供有价值的分析、讨论也可获得纪念章一枚。

每两周的优胜者可获得itpub奖励的技术图书一本。

以往旧题索引:
http://www.itpub.net/forum.php?m ... eid&typeid=1808

原始出处:
http://www.plsqlchallenge.com/

作者:Steven Feuerstein

运行环境:SQLPLUS, SERVEROUTPUT已打开
注:本题给出答案时候要求给予简要说明才能得到奖品

ALTER SESSION SET NLS_DATE_FORMAT = 'DD-MON-YY';

哪些选项的代码可用来取代下列代码块中的 ##REPLACE## :

CREATE OR REPLACE FUNCTION qz_is_same_day (date1_in IN DATE, date2_in IN DATE)
   RETURN BOOLEAN
   AUTHID DEFINER
IS
BEGIN
   RETURN ##REPLACE##;
END;
/

使得上述函数编译之后,再执行下面的代码,"Same Day"会被显示两次?

BEGIN
   IF qz_is_same_day (DATE '2018-04-01', DATE '2018-04-01')
   THEN
      DBMS_OUTPUT.put_line ('Same Day');
   END IF;
   
   IF qz_is_same_day (DATE '2018-04-01' + .5, DATE '2018-04-01' + .75)
   THEN
      DBMS_OUTPUT.put_line ('Same Day');
   END IF;
   
   IF qz_is_same_day (DATE '2018-04-01' + .5, DATE '2018-04-02' + .25)
   THEN
      DBMS_OUTPUT.put_line ('Same Day');
   END IF;
END;
/

(A)
date1_in = date2_in

(B)
TRUNC (date1_in) = TRUNC (date2_in)

(C)
TO_CHAR (date1_in) = TO_CHAR (date2_in)

(D)
TO_CHAR (date1_in, 'YYYY-MM-DD') = TO_CHAR (date2_in, 'YYYY-MM-DD')

(E)
TO_CHAR (date1_in, 'J') = TO_CHAR (date2_in, 'J')

(F)
ABS (date1_in - date2_in) < 1
论坛徽章:
136
秀才
日期:2015-11-23 09:48:22秀才
日期:2016-02-18 09:23:46秀才
日期:2016-02-18 09:24:302016猴年福章
日期:2016-02-18 09:31:30秀才
日期:2016-02-18 09:39:10秀才
日期:2016-02-18 10:06:46秀才
日期:2016-02-18 10:08:02秀才
日期:2016-02-18 10:08:14秀才
日期:2016-03-01 09:57:08天蝎座
日期:2016-03-18 14:23:56
发表于 2018-4-10 08:53 | 显示全部楼层
B,C,D,E

使用道具 举报

回复
认证徽章
论坛徽章:
0
发表于 2018-4-10 10:01 | 显示全部楼层
A、B、C 错误,ALTER SESSION SET NLS_DATE_FORMAT = 'DD-MON-YY'; 时间已经被格式化,能输出三次"Same Day"
D 正确,第一个和第三个都能输出 "Same Day"
E、F 正确,时间精确到月

使用道具 举报

回复
论坛徽章:
7
懒羊羊
日期:2018-02-27 22:52:20秀才
日期:2018-03-01 10:05:18秀才
日期:2018-03-01 10:13:04秀才
日期:2018-03-01 10:13:04秀才
日期:2018-03-01 10:13:04秀才
日期:2018-03-01 10:21:25举人
日期:2018-03-01 10:25:45
发表于 2018-4-10 11:41 | 显示全部楼层
B,C,D,E

使用道具 举报

回复
论坛徽章:
486
秀才
日期:2015-09-09 10:33:01秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12状元
日期:2015-11-23 10:04:09举人
日期:2015-11-23 10:04:09秀才
日期:2016-01-06 14:10:21秀才
日期:2016-01-06 14:10:21秀才
日期:2016-01-06 14:10:21秀才
日期:2016-01-06 14:10:21秀才
日期:2016-01-06 14:10:21
 楼主| 发表于 2018-4-11 04:46 | 显示全部楼层
答案BCDE, 由于楼上未对答案进行说明,本期无人得奖。

A: 简单地比较两个日期是不行的。假如两个DATE在同一天的不同时间,这个比较会返回FALSE。"Same Day"只是被显示了一次。
B:(推荐)
通过调用TRUNC, 我去除了时间部分,所以我们只是在比较日期部分(YYYY-MM-DD)。所以假如两个DATE落在同一天就会返回TRUE.
C: (不推荐)
我们假设缺省的日期格式掩码是 "DD-MON-YY"。所以 TO_CHAR 会返回日期部分,而不代时间,于是当两个参数只有时间不同时,表达式会返回TRUE。

这是一种危险的写代码的方法。你应该永远加入明确的格式掩码来避免潜在的bug(会话中的格式掩码可能在你的代码之外被修改!)

D: (推荐)
现在我用了TO_CHAR来转换成日期,但是我明确提供了一个格式掩码并去除了时间部分。所以这个比较逻辑能够正常运作。
E: "J" 格式返回的是儒略历:自从公元前4712年1月1日以来的天数。这是一个整数值,不包含时间部分,所以这个比较是可行的。
F: 这个表达式基本上是在说:如果两个日期相差24小时之内就返回TRUE。

这在某些情况下没有问题并且可能很有用。但是在本例中,它是行不通的,因为两个DATE可能相差在24小时之内但仍不处于同一天。
结果,"Same Day" 被显示了三次。

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则

TOP技术积分榜 社区积分榜 徽章 电子杂志 团队 统计 虎吧 老博客 知识索引树 读书频道 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档 | IT博客
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛 | SAP ERP系统
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 网站律师 隐私政策 知识产权声明
京ICP备16024965号 北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表