iT邦幫忙

0

T-SQL 上一季第一天日期與本季第一天日期語法

匿名 2013-05-08 17:19:5212066 瀏覽

因剛T-SQL,想練習抓以季為單位資料
請問如以當下日期顯示上一季第一天日期與本季第一天日期語法該怎麼寫
感激不盡,謝謝~
例如:今天20130508,上一季第一天為20130101,本季第一天為20130401

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
8
Albert
iT邦高手 1 級 ‧ 2013-05-08 19:23:34
最佳解答

上一季第一天
SELECT DATEADD(qq,DATEDIFF(qq,0,getdate()-90),0) [/quote]
不可以減 90 謝謝

下一季第一天
SELECT DATEADD(qq,DATEDIFF(qq,0,getdate()+90),0)
不可以加 90 謝謝

3個月 =/= 90 謝謝

看更多先前的回應...收起先前的回應...
Albert iT邦高手 1 級 ‧ 2013-05-08 19:34:46 檢舉

應該說是
答案都是對的
但是表達方式很特別
31+28+31 應該是 -90不會超過
31+30+31 應該是 +90不會超過 但有可能不是下一季

謝謝阿伯指正!謝謝

Albert iT邦高手 1 級 ‧ 2013-05-08 19:39:50 檢舉

下一季第一天
SELECT DATEADD(qq,DATEDIFF(qq,0,DATEADD(qq,1,getdate())),0)

建議 加一季,不要加 90天
IF 今天是 4/1 + 90天 還是在同一季 因此會出現下一季第一天 = 4/1

也可使用
SELECT DATEADD(qq,DATEDIFF(qq,0,dateadd(mm,3,getdate())),0)

Albert iT邦高手 1 級 ‧ 2013-05-08 19:44:50 檢舉

richardsuma 大大拋磚 我是瓦片 共築 IT 大樓

上一季第一天
SELECT DATEADD(qq,DATEDIFF(qq,0,dateadd(mm,-2,getdate())),0)

剛測試過是ok的!

修正:
上一季第一天
SELECT DATEADD(qq,DATEDIFF(qq,0,dateadd(mm,-3,'2013-02-28')),0)

jamesjan iT邦高手 1 級 ‧ 2013-05-09 09:03:20 檢舉

阿伯大出神入化,拜謝謝

幫板主整理一下

<pre class="c" name="code">下一季第一天
SELECT DATEADD(qq,DATEDIFF(qq,0,DATEADD(qq,1,getdate())),0)
本季第一天
SELECT DATEADD(qq,DATEDIFF(qq,0,DATEADD(qq,0,getdate())),0)
上一季第一天
SELECT DATEADD(qq,DATEDIFF(qq,0,DATEADD(qq,-1,getdate())),0)

加送每月最後一天語法

<pre class="c" name="code">SELECT DATEADD(d,-1,convert(datetime,convert(char(7),dateadd(m,1,getdate()),111)+'/01'))

觀念:每月最後一天=(下個月第一天 - 1 天)

延伸:

<pre class="c" name="code">下季最後一天
SELECT DATEADD(d,-1,(SELECT DATEADD(qq,DATEDIFF(qq,0,DATEADD(qq,2,getdate())),0)))
本季最後一天
SELECT DATEADD(d,-1,(SELECT DATEADD(qq,DATEDIFF(qq,0,DATEADD(qq,1,getdate())),0)))
上季最後一天
SELECT DATEADD(d,-1,(SELECT DATEADD(qq,DATEDIFF(qq,0,DATEADD(qq,0,getdate())),0)))
6
richardsuma
iT邦大師 1 級 ‧ 2013-05-08 18:03:55

本季第一天
SELECT DATEADD(qq,DATEDIFF(qq,0,getdate()),0)
上一季第一天
SELECT DATEADD(qq,DATEDIFF(qq,0,getdate()-90),0)
下一季第一天
SELECT DATEADD(qq,DATEDIFF(qq,0,getdate()+90),0)

可以參考:
http://miisoo.blogspot.tw/2008/04/sql-server-select-isdate2004-03-01-1.html

12
賽門
iT邦超人 1 級 ‧ 2013-05-09 01:09:20

辛苦點, 寫個Function來處理吧!

<pre class="c" name="code">CREATE FUNCTION dbo.QuarterFirst(@dToday DATETIME, @sType NVARCHAR(1)) 
       RETURNS DATETIME 
AS 
BEGIN; 
  DECLARE @iMonth int;
  DECLARE @iYear int;
  DECLARE @dReturn DATETIME;
  DECLARE @iQuarter int;

  SET @iMonth = MONTH(@dToday);
  SET @iYear = YEAR(@dToday);
  IF @sType = 'L'
	SET @iQuarter = CEILING(@iMonth / 3.0) - 1;
  ELSE
	SET @iQuarter = CEILING(@iMonth / 3.0);

  IF @iQuarter = 0 BEGIN
	SET @iQuarter = 4;
	SET @iYear = @iYear - 1;
  END;

  SET @dReturn = CONVERT(DATETIME, LTRIM(STR(@iYear)) + '/' + LTRIM((@iQuarter - 1) * 3 + 1) + '/1')

  RETURN @dReturn; 
END; 

測試結果:

第二個參數控制本季(T)或上季(L).

看更多先前的回應...收起先前的回應...
Albert iT邦高手 1 級 ‧ 2013-05-09 08:48:09 檢舉

大師出手 天下臣服

pantc328 iT邦高手 1 級 ‧ 2013-05-09 10:21:14 檢舉

這種問題都要問,還自稱大師,還說薪水多高,產品多好
已知是每月第一天
已知是每季,一年有四季,一季有3月...
全部都是常數
跟1+1=2問題一樣簡單

pantc328 iT邦高手 1 級 ‧ 2013-05-09 10:22:56 檢舉

不好意思我不是回simon581923的文
ITHome的排版有點怪,只有在你的下面有回應按鈕可按

Albert iT邦高手 1 級 ‧ 2013-05-09 10:38:26 檢舉

:simon581923( iT邦大師2級 )

賽大 乃認證過的大師
pantc328 大大如果不服可以告 ithome

Albert iT邦高手 1 級 ‧ 2013-05-09 10:46:02 檢舉

ithome

賽大 等大師級人才濟濟

也有一些連一個 [一個系統][一個功能] 都做不出來, 天天都是負面的話

這樣的人真的很特別

但也凸顯大師級人才的珍貴

大家加油

如果工作10年還沒奧地利的起薪 1998歐元 ,
不知是國家需要懺悔
還是個人需要懺悔

外國大學畢業生
全球年輕人都可到奧地利的大學和高等專科學校留學。在留學期間,他們要學習相應學科的專業知識,並熟悉這裏的語言、文化和工作環境。憑借所學到的技能和知識,他們將成為可推動奧地利經濟發展的巨大潛力。

來自非歐盟國家的大學畢業生可以通過簡易程序取得 Rot-Weiß-Rot – Karte 並留在這裏工作。

如果他們已在某所奧地利大學、高等專科學校或經批準的私立大學至少完成了碩士學位第 2 階段學習或整個專業碩士學位的學習,在畢業之後他們可以在奧地利多待 6 個月,並利用這段時間尋找工作。
當他們找到與自己學歷相符且薪酬達到法定最低工資的工作時,就可以申請 Rot-Weiß-Rot – Karte。

2013 年最低工資標準:每月總收入 1,998 歐元
他們不需要經過積分系統評分,並且也無需 勞務市場服務部 進行替代人員的搜索程序。

可在 6 個月居留期內直接在奧地利申請 Rot-Weiß-Rot – Karte。您可以在 移民局門戶網 找到更詳細的信息。

留學期間的工作機會
來自非歐盟國家的留學生在留學期間就可以積累實習經驗,並在以下範圍內從事工作:

攻讀碩士學位第 1 階段或學士學位時最多每周 10 小時,
攻讀碩士學位第 2 階段或專業碩士學位時最多每周 20 小時

賽門 iT邦超人 1 級 ‧ 2013-05-09 11:34:30 檢舉

P大請安心~~
解法很多, 只是用不一樣的方法來思考而已, 順便磨一下自己的Coding能力. 謝謝

pantc328 iT邦高手 1 級 ‧ 2013-05-09 17:23:52 檢舉

哈哈~本來要回博大的文,因為只有賽大下面有回應按鈕可以按就~進來了

我要發表回答

立即登入回答