2015年6月22日 星期一

SQL Server取得當月第一天及最後一天

方法一:
參考出處
當月第一天
DECLARE @StartTime datetime = DATEADD(day,-DAY(GETDATE())+1, CONVERT(datetime,CONVERT(date, GETDATE())))

當月最後一天
DECLARE @EndTime datetime = DATEADD(ss, -1, DATEADD(m,1,@StartTime))

上月第一天
DECLARE @StartTime datetime = DATEADD(day,-DAY(GETDATE())+1, CONVERT(datetime, CONVERT(date, DATEADD(MM, -1,GETDATE()))))

方法二:
德瑞克:SQL Server 學習筆記

需求:
計算與目前日期為基礎,其相差特定月數的最後一天

公式:
SELECT DATEADD(MM, DATEDIFF(MM, -1, GETDATE()) + <相差特定月數>, 0) - 1 AS N'xxx月最後一天'
 
請參考以下的範例程式碼:
DECLARE @date DATETIME
SET @date = GETDATE()
 
SELECT DATEADD(MM, DATEDIFF(MM, -1, @date), 0) - 1 AS N'本月最後一天' , @date N'今天'
SELECT DATEADD(MM, DATEDIFF(MM, -1, @date) - 1, 0) - 1 AS N'前一個月最後一天' , @date N'今天'
 
SELECT DATEADD(MM, DATEDIFF(MM, -1, @date) + 1, 0) - 1 AS  N'下一個月最後一天' , @date N'今天'
 
SELECT DATEADD(MM, DATEDIFF(MM, -1, @date) - 2, 0) - 1 AS N'前兩個月最後一天' , @date N'今天'
 
SELECT DATEADD(MM, DATEDIFF(MM, -1, @date) + 2, 0) - 1 AS  N'下兩個月最後一天' , @date N'今天'
 

2015年6月15日 星期一

小明又出現了 。。。老師瘋了!

課堂上,
漂亮女老師嚴肅地給小朋友解釋:
“乳”就是“小”的意思。
比如“乳猪”就是“小猪”,
“乳鴿”就是“小鴿”。
小明,
請你用“乳”字造個句。
 
小明:
我家經濟條件不太好,
只能住十幾坪的乳房。
 
老師:(我暈)
……這個不行……換一個。
 
小明:
我每天上學都要跳過我家門口的一條乳溝。
 
老師:(昏倒)
……不行……再換一個。
 
小明:
……老師,我實在想不出來了。
把我的乳頭都想破了!
老師:……

小明又出現了……
老師:
“多位數減法,
遇到低位數不够減時,
就向高位數去借。”
小明:
“高位數不借怎麼辦?”
老師:
“你出去..!”

老師講到大洪水把地球上生物全淹死了。
小明問老師:你確定?
老師說:確定。
小明:那魚呢?
老師:你出去!

老師突然發話:
“好,
誰要是能答出我問的下一個問題,
就能直接下課回家。”
小明當即把書包往窗外一扔。
“是誰扔的?”
“我扔的!那我回家了啊……”
老師:……

老師出對聯
“國興旺,家興旺,國家興旺”。
班長對下聯
“天恢宏,地恢宏,天地恢宏”。
小明對的下聯是
“你媽的,他媽的,你他媽的”。
老師:“你出去!”


老師說:
“猪是一種很有用的動物,
它的肉可以吃,
它的皮可以做皮革,
它的毛可以做刷子,
現在有誰說得出它還有其他用途嗎?”
“老師,”小明答,“它的名字可以罵人。”
老師:“你出去!”

老師:
“請大家想像一下,
假如你在一個有恐龍的世界裡,
而有一條正準備要吃你,
你該麼辦?”
小明:
“這還不簡單!
馬上停止想像就行。”
老師:“你出去!”


歷史課,老師問小明:
你知道李時珍的著作是什麼嗎?
小明答道:
我不知道他的著作,
但是我知道他死前最後一句話說的是什麼。
老師很好奇,問他說什麼。
小明:這草有毒.....
老師:你出去!


老師:蒸一個包子三分鐘,蒸三個包子要多久?
小明:九分鐘?
老師:你傻呀!你們家蒸包子一個一個蒸呀?!
小明表示不服:那我問你,吃一個饅頭一分鐘,吃十個饅頭呢?
老師:十分鐘呀!你以為我像你一樣傻呀!
小明:十分鐘吃十個饅頭!撐死你個傻蛋!
老師:。。。 滾出去!
******************************

JOIN與TOP1並用

有新的JOIN方式,但僅適用於2005以後的版本。

舊的寫法用SUB SELECT寫法會Timeout,新的只需17秒。

SELECT *
FROM FDRPSSDI AS D
OUTER APPLY (
SELECT TOP 1 NEWCARD, NEWPRI
FROM (
SELECT M2.STDATE, M2.ORDNO, D2.NEWCARD, D2.NEWPRI
FROM FDRCAMD1 AS D2
LEFT JOIN FDRCAMMI AS M2 ON M2.PROJNO = D2.PROJNO
LEFT JOIN FDRCAMD2 AS C2 ON M2.PROJNO = C2.PROJNO
WHERE 1 = 1
AND M2.SUITGONO = '1'
AND C2.CUNO = '0018'
AND M2.STDATE <= '20150601'
AND D2.GONO = D.GONO1
AND M2.YNSTATE = 'Y'
AND M2.NEVEREND <> 'Y'
UNION ALL
SELECT M2.STDATE, M2.ORDNO, D2.NEWCARD, D2.NEWPRI
FROM FDRCAMD1 AS D2
LEFT JOIN FDRCAMMI AS M2 ON M2.PROJNO = D2.PROJNO
WHERE 1 = 1
AND M2.SUITGONO = '2'
AND M2.STDATE <= '20150601'
AND D2.GONO = D.GONO
AND M2.YNSTATE = 'Y'
AND M2.NEVEREND <> 'Y'
UNION ALL
SELECT M2.STDATE, M2.ORDNO, D2.NEWCARD, D2.NEWPRI
FROM FDRCAMD1 AS D2
LEFT JOIN FDRCAMMI AS M2 ON M2.PROJNO = D2.PROJNO
LEFT JOIN FDRCAMD2 AS C2 ON M2.PROJNO = C2.PROJNO
WHERE 1 = 1
AND M2.SUITGONO = '1'
AND C2.CUNO = '0018'
AND M2.STDATE <= '20150601'
AND D2.GONO = D.GONO1
AND M2.YNSTATE = 'Y'
AND M2.NEVEREND = 'Y'
UNION ALL
SELECT M2.STDATE, M2.ORDNO, D2.NEWCARD, D2.NEWPRI
FROM FDRCAMD1 AS D2
LEFT JOIN FDRCAMMI AS M2 ON M2.PROJNO = D2.PROJNO
WHERE 1 = 1
AND M2.SUITGONO = '2'
AND M2.STDATE <= '20150601'
AND D2.GONO = D.GONO
AND M2.YNSTATE = 'Y'
AND M2.NEVEREND = 'Y'
) AS A
ORDER BY STDATE DESC, ORDNO) AS B
WHERE 1 = 1
AND D.CUNO = '0018'
AND D.PDATE = '20150601'
AND ISNULL(D.CARD2, '') = ''