sql server 中获取前一天日期_图解SQL面试题:如何比较日期数据?
?【題目】
下面是某公司每天的營業(yè)額,表名為“日銷”。“日期”這一列的數(shù)據(jù)類型是日期類型(date)。
請找出所有比前一天(昨天)營業(yè)額更高的數(shù)據(jù)。(前一天的意思,如果“當(dāng)天”是1月,“昨天”(前一天)就是1號)
例如需要返回一下結(jié)果:
【解題思路】
1.交叉聯(lián)結(jié)
首先我們來復(fù)習(xí)一下之前課程《從零學(xué)會sql》里講過的交叉聯(lián)結(jié)(corss join)的概念。
使用交叉聯(lián)結(jié)會將兩個(gè)表中所有的數(shù)據(jù)兩兩組合。如下圖,是對表“text”自身進(jìn)行交叉聯(lián)結(jié)的結(jié)果:
直接使用交叉聯(lián)結(jié)的業(yè)務(wù)需求比較少見,往往需要結(jié)合具體條件,對數(shù)據(jù)進(jìn)行有目的的提取,本題需要結(jié)合的條件就是“前一天”。
2.本題的日銷表交叉聯(lián)結(jié)的結(jié)果(部分)如下。這個(gè)交叉聯(lián)結(jié)的結(jié)果表,可以看作左邊三列是表a,右邊三列是表b。
紅色框中的每一行數(shù)據(jù),左邊是“當(dāng)天”數(shù)據(jù),右邊是“前一天”的數(shù)據(jù)。比如第一個(gè)紅色框中左邊是“當(dāng)天”數(shù)據(jù)(2號),右邊是“前一天”的數(shù)據(jù)(1號)。
題目要求,銷售額條件是:“當(dāng)天” > “昨天”(前一天)。所以,對于上面的表,我們只需要找到表a中銷售額(當(dāng)天)大于b中銷售額(昨天)的數(shù)據(jù)。
3.另一個(gè)需要著重去考慮的,就是如何找到 “昨天”(前一天),這里為大家介紹兩個(gè)時(shí)間計(jì)算的函數(shù)
daffdate(日期1, 日期2): 得到的結(jié)果是日期1與日期2相差的天數(shù)。 如果日期1比日期2大,結(jié)果為正;如果日期1比日期2小,結(jié)果為負(fù)。例如:日期1(2019-01-02),日期2(2019-01-01),兩個(gè)日期在函數(shù)里互換位置,就是下面的結(jié)果
另一個(gè)關(guān)于時(shí)間計(jì)算的函數(shù)是:
timestampdiff(時(shí)間類型, 日期1, 日期2) 這個(gè)函數(shù)和上面diffdate的正、負(fù)號規(guī)則剛好相反。 日期1大于日期2,結(jié)果為負(fù),日期1小于日期2,結(jié)果為正。在“時(shí)間類型”的參數(shù)位置,通過添加“day”, “hour”, “second”等關(guān)鍵詞,來規(guī)定計(jì)算天數(shù)差、小時(shí)數(shù)差、還是分鐘數(shù)差。示例如下圖:
【解題步驟】
1.將日銷表進(jìn)行交叉聯(lián)結(jié)
2.選出上圖紅框中的“a.日期比b.日期大一天”
可以使用“diffdate(a.日期, b.日期) = 1”或者“timestampdiff(day, a.日期, b.日期) = -1”,以此為基準(zhǔn),提取表中的數(shù)據(jù),這里先用diffdate進(jìn)行操作。
代碼部分:
elect * from 日銷 as a cross join 日銷 as b on datediff(a.日期, b.日期) = 1;得到結(jié)果:
3.找出a中銷售額大于b中銷售額的數(shù)據(jù)
where a.銷售額(萬元) > b.銷售額(萬元)
得到結(jié)果:
4.刪掉多余數(shù)據(jù)
題目只需要找銷售額大于前一天的ID、日期、銷售額,不需要上表那么多數(shù)據(jù)。所以只需要提取中上表的ID、日期、銷售額(萬元)列。
結(jié)合一開始提到的兩個(gè)處理時(shí)間的方法,最終答案及結(jié)果如下:
select a.ID, a.日期, a.銷售額(萬元) from 日銷 as a cross join 日銷 as b on datediff(a.日期, b.日期) = 1 where a.銷售額(萬元) > b.銷售額(萬元);或者
elect a.ID, a.日期, a.銷售額(萬元) from 日銷 as a cross join 日銷 as b on timestampdiff(day, a.日期, b.日期) = -1 where a.銷售額(萬元) > b.銷售額(萬元);【本題考點(diǎn)】
1)考察邏輯思維能力,可以使用課程《分析方法》中的邏輯樹分析方法將復(fù)雜問題拆解成一個(gè)一個(gè)可以解決的子問題
2)考察多表聯(lián)結(jié)
3)針對時(shí)間的處理語句是在業(yè)務(wù)中經(jīng)常用到的,需要熟練掌握。
4) 尤其考察對不同sql數(shù)據(jù)格式處理的掌握程度,
【舉一反三】
下面是氣溫表,名為weather,date列的數(shù)據(jù)格式為date,請找出比前一天溫度更高的ID和日期
參考答案:
elect a.ID, a.date from weather as a cross join weather as b on datediff(a.date, b.date) = 1 where a.temp > b.temp;或者:
elect a.ID, a.date from weather as a cross join weather as b on timestampdiff(day, a.date, b.date) = -1 where a.temp > b.temp;得到結(jié)果:
推薦:如何從零學(xué)會人工智能必備技能:數(shù)據(jù)庫和sql?
《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的sql server 中获取前一天日期_图解SQL面试题:如何比较日期数据?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: led内部结构_粘合剂和密封胶性质一样吗
- 下一篇: linux cmake编译源码,linu