iT邦幫忙

0

想請問如何的找出某月初以星期三為起始月尾也以星期三為終止點!

想請問如何的找出某月初以星期三為起始月尾也以星期三為終止點,如6/1是星期六那就設6/5星期三為本月開始點,月尾6/30星期日,那就在往後退到7/3星期三為月尾的終止點,請問先進老師,SQL的話我該怎麼抓這樣的範圍,或是寫程式我該怎麼寫比較好..
我是用ASP.NET VB ,謝謝大家的指教..

紅色框線為每個月要抓的規則 ,

看更多先前的討論...收起先前的討論...
總裁 iT邦好手 1 級 ‧ 2013-07-19 16:02:41 檢舉
您這樣每個月只抓了29天,其他月要怎麼算呀??暈
這樣的週期很危險耶...冷
ted99tw iT邦高手 1 級 ‧ 2013-07-19 16:18:33 檢舉
也可以每月抓30天,然後年底再加5天,古埃及人就是這樣算出尼羅河週期的...冷
小成 iT邦高手 10 級 ‧ 2013-07-19 16:36:54 檢舉
泰大連古埃及人怎樣算尼羅河週期都知道
那孔明是怎樣看出該點七星燈的,不曉得泰大知不知道...
ted99tw iT邦高手 1 級 ‧ 2013-07-19 16:39:34 檢舉
埃及人的事情,希羅多德的"歷史"裏就有寫了。

至於孔明的七星燈,那就要問羅貫中了...
總裁 iT邦好手 1 級 ‧ 2013-07-19 16:45:22 檢舉
原來不是問新聞龍捲風...筆記
賽門 iT邦超人 1 級 ‧ 2013-07-19 16:46:45 檢舉
查火星月曆...
slime iT邦大師 1 級 ‧ 2013-07-23 20:11:00 檢舉
關於 mod 7 會錯誤的問題, 可以用
(4 + 7 - 5) mod 7 解決.

2 個回答

6
slime
iT邦大師 1 級 ‧ 2013-07-19 23:31:41
最佳解答

試想:

  1. 用 weekday 找出 2013/6/1 是星期幾.
  2. 找出下一個星期三是 6/1 的幾天之後
    (例如 weekday(6/1)=7 (因為週六的代號是 7 ), 下週三代號是 4
    (4 - 7(週六)) mod 7 = 4 , 表示下一個週三是 4 天後.
  3. 2013/6/1 + 4 = 2013/6/5

(公式就懶得寫了, 原理知道就可以處理.)

(不過結束應該算到週二的23:59:59吧?)

推這個回答, 概念說明出來
實踐發問者自己去想
這樣才會進步

sundayjoe iT邦新手 5 級 ‧ 2013-07-22 11:12:32 檢舉

有方向了...感謝感謝
我try try 看...
是的我是要算到下個星期二....嘿

sundayjoe iT邦新手 5 級 ‧ 2013-07-23 00:57:29 檢舉

slime , 大
我試好多次...下個月套用你的方法就不對了..
8月第一天w4 , (4 - 5(週四)) mod 7 = 1
我太笨了...可以在提示一些嗎...

4
player
iT邦大師 1 級 ‧ 2013-07-20 02:01:05

如果用T-SQL的話, 大約這樣, 如果沒寫錯的話, 你自己測吧
Exec [dbo].[Test1] 2013,7,4
第三個參數4代表周三, 周日為1, 周六為7

Create PROCEDURE [dbo].[Test1] (
@year as int
,@month as int
,@dw as int
) AS
BEGIN
SET NOCOUNT ON;

DECLARE @date1 as datetime;
DECLARE @date2 as datetime;
DECLARE @date3 as datetime;
DECLARE @date4 as datetime;
DECLARE @dw1 as int;
DECLARE @dw2 as int;

--取得指定月份的第一天
SELECT @date1=convert(datetime, convert(varchar(4), @year) +'/'+ convert(varchar(2), @month) +'/1');

Select @dw1=DATEPART(dw, @date1);
if (@dw1 = @dw)
select @date3 = @date1;
else if (@dw1 < @dw)
select @date3 = DATEADD(dd, (@dw - @dw1), @date1);
else
select @date3 = DATEADD(dd, (7 + @dw - @dw1), @date1);

--取得次月的第一天
SELECT @date2=dateadd(mm,1,DATEADD(mm,DATEDIFF(mm,0,@date1),0));

Select @dw2=DATEPART(dw, @date2);
if (@dw2 = @dw)
select @date4 = @date2;
else if (@dw2 < @dw)
select @date4 = DATEADD(dd, (@dw - @dw2), @date2);
else
select @date4 = DATEADD(dd, (7 + @dw - @dw2), @date2);

select @date1 as D1, @date2 as D2, @date3 as D3, @date4 as D4;
END

我要發表回答

立即登入回答