2014年11月11日 星期二

計算時間整理



如何用簡單的 SQL 技巧取得特定日期是否為週末假日

select DATEDIFF(DAY, '17530101', '2009-01-19') % 7 / 5   -- 0
select DATEDIFF(DAY, '17530101', '2009-01-20') % 7 / 5   -- 0
select DATEDIFF(DAY, '17530101', '2009-01-21') % 7 / 5   -- 0
select DATEDIFF(DAY, '17530101', '2009-01-22') % 7 / 5   -- 0
select DATEDIFF(DAY, '17530101', '2009-01-23') % 7 / 5   -- 0
select DATEDIFF(DAY, '17530101', '2009-01-24') % 7 / 5   -- 1
select DATEDIFF(DAY, '17530101', '2009-01-25') % 7 / 5   -- 1

select DATEDIFF(DAY, '17530101', tb.CreationOn) % 7 / 5 FROM tb;
select datepart(weekday,'2009-01-19')%6 -- 2 
select datepart(weekday,'2009-01-20')%6 -- 3 
select datepart(weekday,'2009-01-21')%6 -- 4 
select datepart(weekday,'2009-01-22')%6 -- 5 
select datepart(weekday,'2009-01-23')%6 -- 0 
select datepart(weekday,'2009-01-24')%6 -- 1 
select datepart(weekday,'2009-01-25')%6 -- 1 

對於想在程式中單純的判斷「假日」與「非假日」就無法得到 0 與 1 的效果,因為在 SQL Server 中 0 可以直接代表 False,1 可以直接代表 True,我如果要在同一個欄位回應 True/False 你的方法就不行。 


如何在 Excel 中計算兩個日期之間的月數
若要計算任何兩個日期之間的月數,請使用下列其中一種方法。注意,這兩種方法都使用下列資訊:
  • EDate = 較早日期
  • LDate = 較晚日期注意:如果您直接在此公式中輸入 LDate 或 EDate,而不是輸入到其儲存格參照中,就必須以雙引號括住 (例如 "9/7/00")。

無條件進位

此方法不在其計算中使用月份日期。例如,假設開始日期是 10/31/00,結束日期是 11/2/00,即使只過了兩天,也會傳回一個月。

針對此方法,請使用下列公式
=(YEAR(LDate)-YEAR(EDate))*12+MONTH(LDate)-MONTH(EDate)
如以下列範例所示:
  1. 在儲存格 A1 中輸入 10/31/10。
  2. 在儲存格 A2 中輸入下列公式:
    =(YEAR(NOW())-YEAR(A1))*12+MONTH(NOW())-MONTH(A1)
    傳回的數字等於從 10/31/99 到今天日期的月數,並無條件進位到下一個整數。

無條件捨去

此方法在其計算中使用天數,並將最接近的完整月數後面無條件捨去。例如,假設開始日期是 10/30/00,結束日期是 11/30/10,則會傳回一個月;不過,結束日期若為 11/29/10,則傳回 0。

針對此方法,請使用下列公式
=IF(DAY(LDate)>=DAY(EDate),0,-1)+(YEAR(LDate)-YEAR(EDate))
*12+MONTH(LDate)-MONTH(EDate)
如以下列範例所示:
  1. 在儲存格 A1 中輸入 10/31/10。
  2. 在儲存格 B1 中輸入下列公式:
    =IF(DAY(NOW())>=DAY(A1),0,-1)+(YEAR(NOW())-YEAR(A1)) *12+MONTH(NOW())-MONTH(A1)
    注意:請確定儲存格 B1 已格式化為 [通用格式]。傳回的數字等於從 10/31/10 到今天日期的月數,並將最接近的完整月數後面無條件捨去。




沒有留言: