涟源| 万荣| 阳东| 鄂托克旗| 武陟| 陆川| 滦南| 南澳| 麟游| 乐亭| 那坡| 光泽| 炎陵| 喀什| 武功| 沧县| 桦川| 东平| 图木舒克| 胶州| 万载| 乐清| 新宁| 丹巴| 五峰| 五莲| 平度| 玉溪| 峨眉山| 维西| 北碚| 莱州| 乃东| 宁远| 鄄城| 珠穆朗玛峰| 屯昌| 梧州| 北流| 龙里| 娄烦| 登封| 延长| 靖边| 修武| 惠来| 南漳| 祁县| 太谷| 山阳| 西乡| 惠东| 卓资| 盘山| 杨凌| 介休| 民权| 宁县| 拉孜| 滨海| 仁怀| 阿坝| 赤峰| 长清| 丰台| 哈巴河| 新竹县| 溧水| 江源| 承德县| 湖州| 万山| 张家川| 淇县| 乐平| 斗门| 睢宁| 石龙| 鼎湖| 容县| 安县| 湖口| 丰顺| 河南| 三原| 海安| 彝良| 柯坪| 东海| 蒲城| 湖南| 元阳| 梅县| 赤壁| 榕江| 延安| 蚌埠| 广德| 定日| 延长| 涞水| 达尔罕茂明安联合旗| 临泉| 巴彦| 蓟县| 绥滨| 太仓| 唐海| 门头沟| 五原| 商城| 垣曲| 察雅| 克什克腾旗| 乌苏| 西充| 沙湾| 来凤| 正宁| 尼木| 丰宁| 红原| 鸡西| 江陵| 称多| 仪陇| 萝北| 东台| 汕头| 望都| 恭城| 长白山| 齐齐哈尔| 浙江| 台州| 醴陵| 类乌齐| 革吉| 开封县| 洪雅| 布尔津| 麦盖提| 新沂| 美姑| 许昌| 北仑| 东阿| 和龙| 德庆| 召陵| 疏勒| 隆子| 温宿| 金门| 凭祥| 蔡甸| 西藏| 聂拉木| 红原| 张掖| 民乐| 大宁| 衡阳县| 察哈尔右翼前旗| 衢江| 沙雅| 鸡东| 曲水| 兰考| 石门| 昌江| 杜集| 东明| 栾川| 涟源| 南江| 淮阴| 永善| 清远| 郏县| 康马| 彭阳| 岢岚| 呼兰| 吉隆| 安龙| 泉港| 克拉玛依| 芦山| 潘集| 兴县| 浠水| 绥滨| 巧家| 秦安| 察哈尔右翼前旗| 原平| 泰兴| 临沂| 旬邑| 三亚| 宿迁| 班戈| 彭水| 左云| 建湖| 宝丰| 永胜| 杨凌| 涿鹿| 陆丰| 文安| 临川| 无棣| 布拖| 儋州| 长汀| 云霄| 霸州| 孟州| 芷江| 襄樊| 定安| 邵阳市| 光泽| 喀喇沁左翼| 浑源| 林甸| 安吉| 磴口| 夏津| 册亨| 成武| 涪陵| 长沙县| 剑川| 宜宾县| 丹东| 福贡| 澧县| 天长| 铁山| 清河| 集安| 汾阳| 易县| 土默特右旗| 永平| 阜宁| 彭州| 寻乌| 无极| 曲松| 兰西| 安宁| 海晏| 巴马| 江都| 临江| 平原| 静乐| 无为| 太白| 兴安|

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

 找回密码
 注册
查看: 638|回复: 5

[每日一题] PL/SQL Challenge 每日一题:2018-1-4 TO_TIMESTAMP_TZ函数

[复制链接]
论坛徽章:
486
秀才
日期:2018-05-22 10:33:01秀才
日期:2018-05-22 10:03:12秀才
日期:2018-05-22 10:03:12秀才
日期:2018-05-22 10:03:12状元
日期:2018-05-22 10:04:09举人
日期:2018-05-22 10:04:09秀才
日期:2018-05-22 14:10:21秀才
日期:2018-05-22 14:10:21秀才
日期:2018-05-22 14:10:21秀才
日期:2018-05-22 14:10:21
跳转到指定楼层
1#
发表于 2018-1-9 06:03 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

最先答对且答案未经编辑的puber将获得纪念章一枚(答案不可编辑但可发新贴补充或纠正),其他会员如果提供有价值的分析、讨论也可获得纪念章一枚。

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

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

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

作者: Kim Berg Hansen

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

我有些朋友住在不同的时区:

create table qz_friends (
   friend   varchar2(10)
, tzname   varchar2(64)
)
/

insert into qz_friends values ('Cecilia' , 'America/Chicago')
/
insert into qz_friends values ('Lucille' , 'Europe/London'  )
/
insert into qz_friends values ('Patricia', 'Australia/Perth')
/
commit
/

在应用中,所有的会话都使用UTC时区:

alter session set time_zone='UTC'
/

我住在丹麦,时区是 Europe/Copenhagen, 我想要知道在什么时间(我的当地时间)需要给我的每个朋友发送“新年快乐”的短信,使得他们会在当地时间的午夜收到这条短信。

我写了个未完成的查询来获取这些时间:

select friend
     , to_char(
          ##REPLACE##
        , 'YYYY-MM-DD HH24:MI:SS TZR'
       ) as time_for_sms
  from qz_friends
order by time_for_sms
/

哪些选项包含的表达式可用来取代##REPLACE##使得查询返回这个输出:

FRIEND     TIME_FOR_SMS
---------- ----------------------------------------------------
Patricia   2018-05-22 17:00:00 EUROPE/COPENHAGEN
Lucille    2018-05-22 01:00:00 EUROPE/COPENHAGEN
Cecilia    2018-05-22 07:00:00 EUROPE/COPENHAGEN

(A)
  TO_TIMESTAMP(
             '2018-05-22 00:00:00 ' || tzname
           , 'YYYY-MM-DD HH24:MI:SS TZR'
          ) AT TIME ZONE 'Europe/Copenhagen'

(B)
TO_TIMESTAMP_TZ(
             '2018-05-22 00:00:00 ' || tzname
           , 'YYYY-MM-DD HH24:MI:SS TZR'
          ) AT TIME ZONE 'Europe/Copenhagen'

(C)
  FROM_TZ(
             TO_TIMESTAMP(
                '2018-05-22 00:00:00'
              , 'YYYY-MM-DD HH24:MI:SS'
             )
           , tzname
          ) AT TIME ZONE 'Europe/Copenhagen'

(D)
       FROM_TZ(
             TIMESTAMP '2018-05-22 00:00:00'
           , tzname
          ) AT TIME ZONE 'Europe/Copenhagen'

(E)
         ( TIMESTAMP '2018-05-22 00:00:00'
            AT TIME ZONE 'Europe/Copenhagen' )
          AT TIME ZONE tzname

(F)
         ( TIMESTAMP '2018-05-22 00:00:00'
            AT TIME ZONE tzname )
          AT TIME ZONE 'Europe/Copenhagen'

论坛徽章:
20
2012新春纪念徽章
日期:2018-05-22 11:58:44秀才
日期:2018-05-22 09:55:08秀才
日期:2018-05-22 09:55:08秀才
日期:2018-05-22 10:21:13秀才
日期:2018-05-22 10:30:00秀才
日期:2018-05-22 10:30:00秀才
日期:2018-05-22 10:30:00秀才
日期:2018-05-22 15:04:10秀才
日期:2018-05-22 15:10:43秀才
日期:2018-05-22 09:55:08
2#
发表于 2018-1-9 08:20 | 只看该作者
正确答案:BCDF
A:会报日期格式无法识别的错误,TO_TIMESTAMP函数不能转换为时区
B:正确,TO_TIMESTAMP_TZ函数可以转换为时区
C:正确,Oracle 中的from_tz函数,可以将一个timstamp和timzone拼成一个timestamp with timezone(文档:FROM_TZ converts a timestamp value and a time zone to a TIMESTAMP WITH TIME ZONE value. time_zone_value is a character string in the format 'TZH:TZM' or a character expression that returns a string in TZR with optional TZD format.)
D:正确
E:错误,将哥本哈根的时间转换为了其他地区的时间。
F:正确,将其他地区的时间转换为哥本哈根的时间。
认证徽章
论坛徽章:
0
3#
发表于 2018-1-9 16:10 | 只看该作者
BCD吧
论坛徽章:
486
秀才
日期:2018-05-22 10:33:01秀才
日期:2018-05-22 10:03:12秀才
日期:2018-05-22 10:03:12秀才
日期:2018-05-22 10:03:12状元
日期:2018-05-22 10:04:09举人
日期:2018-05-22 10:04:09秀才
日期:2018-05-22 14:10:21秀才
日期:2018-05-22 14:10:21秀才
日期:2018-05-22 14:10:21秀才
日期:2018-05-22 14:10:21
4#
 楼主| 发表于 2018-1-10 05:19 | 只看该作者
答案BCD,本期无人得奖。3楼请注意在自己答案加上简要说明。

A: TO_TIMESTAMP 函数返回的数据类型是TIMESTAMP, 而非 TIMESTAMP WITH TIME ZONE。因此我们不能用TZR,这个选项会报错:
ORA-01821: date format not recognized.         

B: 我们应该用的是TO_TIMESTAMP_TZ,它接受TZR格式,返回数据类型TIMESTAMP WITH TIME ZONE. 然后我们得到了所要的结果。

C: 前一选项的替代办法是用TO_TIMESTAMP来得到不带时区的TIMESTAMP信息,然后用FROM_TZ将TIMESTAMP转换成指定时区的TIMESTAMP WITH TIME ZONE

D: 我们可以不用前一选项的TO_TIMESTAMP,而是使用一个TIMESTAMP字面常量来达到同样目的。
E: 此处我们创建了一个TIMESTAMP字面常量,它被隐式转换成会话所在时区UTC的 TIMESTAMP WITH TIME ZONE。然后我们问这个时间点在Europe/Copenhagen 时区是什么时间,然后同样时间点在TZNAME的时区又是什么时间。所以我们得到的不是想要的输出,而是UTC午夜的时候在我的朋友的时区是什么时间:

FRIEND     TIME_FOR_SMS
---------- ----------------------------------------------------
Cecilia    2018-05-22 18:00:00 AMERICA/CHICAGO
Lucille    2018-05-22 00:00:00 EUROPE/LONDON
Patricia   2018-05-22 08:00:00 AUSTRALIA/PERTH

F: 我们创建的同样的TIMESTAMP字面常量再次被隐式转换成UTC午夜的时间点了。然后我们问这个时间点在TZNAME的时区是什么时间,然后同样时间点在Europe/Copenhagen时区又是什么时间。所以输出了UTC午夜在哥本哈根的时间:

FRIEND     TIME_FOR_SMS
---------- ----------------------------------------------------
Cecilia    2018-05-22 01:00:00 EUROPE/COPENHAGEN
Patricia   2018-05-22 01:00:00 EUROPE/COPENHAGEN
Lucille    2018-05-22 01:00:00 EUROPE/COPENHAGEN

论坛徽章:
20
2012新春纪念徽章
日期:2018-05-22 11:58:44秀才
日期:2018-05-22 09:55:08秀才
日期:2018-05-22 09:55:08秀才
日期:2018-05-22 10:21:13秀才
日期:2018-05-22 10:30:00秀才
日期:2018-05-22 10:30:00秀才
日期:2018-05-22 10:30:00秀才
日期:2018-05-22 15:04:10秀才
日期:2018-05-22 15:10:43秀才
日期:2018-05-22 09:55:08
5#
发表于 2018-1-10 08:10 | 只看该作者
newkid 发表于 2018-1-10 05:19
答案BCD,本期无人得奖。3楼请注意在自己答案加上简要说明。

A: TO_TIMESTAMP 函数返回的数据类型是TIME ...

C:\Users\JohnLee\Desktop\题.png,我这里执行出来结果是正确的。
论坛徽章:
20
2012新春纪念徽章
日期:2018-05-22 11:58:44秀才
日期:2018-05-22 09:55:08秀才
日期:2018-05-22 09:55:08秀才
日期:2018-05-22 10:21:13秀才
日期:2018-05-22 10:30:00秀才
日期:2018-05-22 10:30:00秀才
日期:2018-05-22 10:30:00秀才
日期:2018-05-22 15:04:10秀才
日期:2018-05-22 15:10:43秀才
日期:2018-05-22 09:55:08
6#
发表于 2018-1-10 08:18 | 只看该作者
本帖最后由 liwenrongdba 于 2018-1-10 08:20 编辑
newkid 发表于 2018-1-10 05:19
答案BCD,本期无人得奖。3楼请注意在自己答案加上简要说明。

A: TO_TIMESTAMP 函数返回的数据类型是TIME ...

F选项我这里执行出来是正确的,难道是我设置了nls_date_format?
SQL> alter session set time_zone='UTC';
Session altered

SQL>
SQL> select friend
  2       , to_char(
  3            ( TIMESTAMP '2018-05-22 00:00:00'
  4              AT TIME ZONE tzname )
  5            AT TIME ZONE 'Europe/Copenhagen'
  6          , 'YYYY-MM-DD HH24:MI:SS TZR'
  7         ) as time_for_sms
  8    from qz_friends
  9  order by time_for_sms
10  ;
FRIEND TIME_FOR_SMS
---------- ----------------------------------------------------
Patricia 2018-05-22 17:00:00 EUROPE/COPENHAGEN
Lucille 2018-05-22 01:00:00 EUROPE/COPENHAGEN
Cecilia 2018-05-22 07:00:00 EUROPE/COPENHAGEN

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

本版积分规则

-周建水论坛,周建水社区 - www-bbs-csy.bwp888.com
DTCC2018购票6.8折优惠进行时

中国数据库技术大会是国内数据库及大数据领域规模最大、最受欢迎的技术交流盛会。 2018年5月10-12日,第九届中国数据库技术大会将如约而至。本届大会以“数领先机•智赢未来”为主题,设定2大主会场及20个技术专场,邀请来自国内外互联网、金融、教育等行业百余位技术专家,共同探讨Oracle、MySQL、NoSQL、大数据等领域的前瞻性热点话题与技术。
----------------------------------------
优惠时间:2018-05-22前

报名链接>>
岳塘区论坛 建邺区论坛 新建论坛 洑口乡论坛 崇阳县论坛
姑嫂塔论坛 淳安县论坛 工业学校论坛 国寿大厦论坛 郸城县论坛
电子杂志 虎吧 老博客 读书频道 积分竞拍 文本模式 帮助
  IT博客
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛 | SAP ERP系统
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 网站律师 隐私政策 知识产权声明
京ICP备16024965号 北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表
长堎论坛 贾伯乐提督街论坛 西安市论坛 海霞新村论坛 石埠街道论坛
公积金中心论坛 吉木萨尔县论坛 西湖论坛 龙里县论坛 潜江市论坛