按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
同样 对字符型列应用该函数时会得到错误信息
输入/输出
SQL》SELECT STDDEV(NAME) FROM TEAMSTATS
ERROR
ORA…01722 invalid number
no rows selected
这些统计函数也可以在一个语句中同时使用
输入/输出
SQL》SELECT COUNT AB AVG(AB) MIN(AB) MAX(AB) STDDEV(AB)
VARIANCE(AB) SUM(AB) FROM TEAMSTATS
COUNT( AVG(A MIN(A MAX( STDDEV( VARIANCE SUM(A
AB) B) B) AB) AB) (AB) B)
6 119。167 1 187 75。589 5712。97 715
当你下次见到比赛结果时 你应该知道了 SQL 正在它的后台工作
日期/ 时间函数
我们的生活是由日期和时间来掌握的 大多数的 SQL 解释器都提供了对它进行支持的
函数 在这一部分我们使用 PROJECT 表来演求日期和时间函数的用法
输入
SQL》 SELECT * FROM PROJECT
输出
TASK STARTDATE ENDDATE
EMAIL wyhsillypig@163。 68
…………………………………………………………Page 69……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪
KICKOFFMTG 01…APR…95 01…APR…95
TECHSURVEY 02…APR…95 01…MAY…95
USERMTGS 15…MAY…95 30…MAY…95
DESIGNWIDGET 01…JUN…95 30…JUN…95
CODEWIDGET 01…JUL…95 02…SEP…95
TESTING 03…SEP…95 17…JAN…96
注 这里的数据类型使用日期型 大多数 SQL 解释器都有日期型 但是在语法的细则
上有不同之处
ADD_MONTHS
该函数的功能是将给定的日期增加一个月 举例来说 由于一些特殊的原因 上述的
计划需要推迟两个月 那么可以用下面的方法来重新生成一个日程表
输入
SQL》SELECT TASK STARTDATE ENDDATE
ORIGINAL_END ADD_MONTHS(ENDDATE;2) FROM PROJECT
输出
TASK STARTDATE ORIGINAL ADD_MONTH
KICKOFFMTG 01…APR…95 01…APR…95 01…JUN…95
TECHSURVEY 02…APR…95 01…MAY…95 01…JUL…95
USERMTGS 15…MAY…95 30…MAY…95 30…JUL…95
DESIGNWIDGET 01…JUN…95 30…JUN…95 31…AUG…95
CODEWIDGET 01…JUL…95 02…SEP…95 02…NOV…95
TESTING 03…SEP…95 17…JAN…96 17…MAR…96
尽管这种延误不太可能发生 但是实现日程的变动却是非常容易的 ADD_MONTHS
也可能工作在 SELECT 之外 试着输入
输入
SQL》SELECT TASK TASKS_SHORTER_THAN_ONE_MONTH
FROM PROJECT WHERE ADD_MONTHS(STARTDATE 1) ENDDATE
结果如下所示
输出
TASKS_SHORTER_THAN_ONE_MONTH
EMAIL wyhsillypig@163。 69
…………………………………………………………Page 70……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪
KICKOFF MTG
TECH SURVEY
USER MTGS
DESIGN WIDGET
分析
你将会发现这一部分中的几乎所有的函数都可能工作在不只一个地方 但是 如果没
有 TO_CHAR 和 TO_DATE 函数的帮助 ADD_MONTH 就无法在字符或数字类型中工作
这将在今天的晚些时候讨论
LAST_DAY
LAST_DAY 可以返回指定月份的最后一天 例如 如果你想知道在 ENDDATE 列中的
给出日期中月份的最后一天是几号时 你可以输入
输入
SQL》SELECT ENDDATE LAST_DAY ENDDATE FROM PROJECT
结果如下
输出
ENDDATE LAST_DAY(ENDDATE)
01…APR…95 30…APR…95
01…MAY…95 31…MAY…95
30…MAY…95 31…MAY…95
30…JUN…95 30…JUN…95
02…SEP…95 30…SEP…95
17…JAN…96 31…JAN…96
如果是在闰年的最后一天呢
输入/输出
SQL》SELECT LAST_DAY( 1…FEB…95 ) NON_LEAP LAST_DAY( 1…FEB…96 )
LEAP
FROM PROJECT;
NON_LEAP LEAP
28…FEB…95 29…FEB…96
28…FEB…95 29…FEB…96
28…FEB…95 29…FEB…96
EMAIL wyhsillypig@163。 70
…………………………………………………………Page 71……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪
28…FEB…95 29…FEB…96
28…FEB…95 29…FEB…96
28…FEB…95 29…FEB…96
分析
结果当然是正确的 可是为什么它输出了这么多行呢 这是因为你没有指定任何列或
给出一个条件 SQL 引擎对数据库中的每一条记录都应用了这一语句 如果你想去掉这些
重复的内容可以这样写
输入
SQL》SELECT DISTINCT LAST_DAY('1…FEB…95') NON_LEAP LAST_DAY('1…FEB…96')
LEAP FROM PROJECT
在这句话中我们使用了关键字 DISTINCT 参见第二天的 介绍查询 — — SELECT 语
句的使用 来得到唯一的结果
输出
NON_LEAP LEAP
28…FEB…95 29…FEB…96
虽然在我的电脑上该函数可以正确地识别出闰年来 但是如果你要将它应用于金融领
域 那么请在你的解释器上试一下 看一看它是否支持闰年
MONTHS_BETWEEN
如 果 你 想 知 道 在 给 定 的 两 个 日 期 中 有 多 少 个 月 可 以 像 这 样 来 使 用
MONTHS_BETWEEN
输入
SQL》select task startdate enddate months between(Startdate;enddate) duration from project
输出
TASK STARTDATE ENDDATE DURATION
KICKOFF MTG 01…APR…95 01…APR…95 0
TECH SURVEY 02…APR…95 01…MAY…95 …。9677419
USER MTGS 15…MAY…95 30…MAY…95 …。483871
DESIGN WIDGET 01…JUN…95 30…JUN…95 …。9354839
CODE WIDGET 01…JUL…95 02…SEP…95 …2。032258
TESTING 03…SEP…95 17…JAN…96 …4。451613
EMAIL wyhsillypig@163。 71
…………………………………………………………Page 72……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪
请等一下 结果看起来不太对劲 再试一下
输入/输出
SQL》 SELECT TASK STARTDATE ENDDATE
MONTHS_BETWEEN ENDDATE;STARTDATE DURATION FROM
PROJECT
TASK STARTDATE ENDDATE DURATION
KICKOFF MTG 01…APR…95 01…APR…95 0
TECH SURVEY 02…APR…95 01…MAY…95 。96774194
USER MTGS 15…MAY…95 30…MAY…95 。48387097
DESIGN WIDGET 01…JUN…95 30…JUN…95 。93548387
CODE WIDGET 01…JUL…95 02…SEP…95 2。0322581
TESTING 03…SEP…95 17…JAN…96 4。4516129
分析
如你所见 MONTHS_BETWEEN 对于你所给出的月份的次序是敏感的 月份值为负
数可能并不是一件坏事 例如 你可以利用负值来判断某一日期是否在另一个日期之前
下例将会显示所有在 1995 年 5 月 19 日以前开始的比赛
输入
SQL》SELECT * FROM PROJECT
WHERE MONTHS_BETWEEN 19 MAY 95 STARTDATE)
输出
TASK STARTDATE ENDDATE
KICKOFF MTG 01…APR…95 01…APR…95
TECH SURVEY 02…APR…95 01…MAY…95
USER MTGS 15…MAY…95 30…MAY…95
NEW_TIME
如果你想把时间调整到你所在的时区 你可以使用 NEW_TIME 下边给出了所有的时
区
简写 时区 简写 时区
AST or ADT 大西洋标准时间 HST or HDT 阿拉斯加_夏威夷时间
BST or BDT 英国夏令时 MST or MDT 美国山区时间
EMAIL wyhsillypig@163。 72
…………………………………………………………Page 73……………………………………………………………
SQL 21 日