计算两个日期之间的天数,不包括周末

时间:2015-01-01 14:38:21

标签: db2 difference days weekend

如何在DB2中找到两个日期之间的差异(不包括周末)?

是否有任何函数可以在DB2中执行此操作?或者我是否需要自己编写查询?

3 个答案:

答案 0 :(得分:1)

AFAIK没有这样的功能。但是,编写一个计算此查询的查询很容易:

with cal(d) as ( 
    values date('2015-01-01') -- start_date 
    union all 
    select d + 1 day from cal 
    where d < '2015-01-15'    -- end_date 
) select count(case when dayofweek(d) between 2 and 6 then 1 end) 
  from cal;

如果你做了很多这类计算,你可能想要创建一个日历表,你可以在这个表中添加国家假日等属性。

答案 1 :(得分:0)

您可以使用此功能:

DAYOFWEEK(CURRENT_DATE)

以下计算将返回两个日期之间的工作日数:

[Week(End Date) - Week(Start Date)] * 5 + [DayofWeek(Start Date) - DayofWeek(End Date)]

仅当Week和Day或等效功能是数据库驱动程序固有的功能时,此方法才有效。客户端访问和Sybase本机连接均支持这些功能。

“星期”功能将给出所选年份中星期几的整数值。 DayofWeek会为所选日期提供1-7之间的整数值。

IBM Support Working Days Between Two Dates

答案 2 :(得分:-1)

这是实现两个日期之间差异的最佳方式,不包括周末周六和周日,也不包括国定假日....

&#13;
&#13;
  /******
   * First, we'll extend the date object with some functionality.
   *   We'll add an  .each() function, as well as an .adjust() function.
   *   .each()  will give us the ability to loop between two dates, whether
   *     by 'day', 'week' or 'month'.
   *   .adjust() will allow us to move a given day by a given unit. This is used
   *     like so: currentDate.adjust('days', 1) to increment by one day.
   ******/
  Date.prototype.each = function(endDate, part, step, fn, bind){
  	var fromDate = new Date(this.getTime()),
  		toDate = new Date(endDate.getTime()),
  		pm = fromDate <= toDate? 1:-1,
  		i = 0;

  	while( (pm === 1 && fromDate <= toDate) || (pm === -1 && fromDate >= toDate) ){
  		if(fn.call(bind, fromDate, i, this) === false) break;
  		i += step;
  		fromDate.adjust(part, step*pm);
  	}
  	return this;
  };
  
  Date.prototype.adjust = function(part, amount){
	part = part.toLowerCase();
	
	var map = { 
				years: 'FullYear', months: 'Month', weeks: 'Hours', days: 'Hours', hours: 'Hours', 
				minutes: 'Minutes', seconds: 'Seconds', milliseconds: 'Milliseconds',
				utcyears: 'UTCFullYear', utcmonths: 'UTCMonth', weeks: 'UTCHours', utcdays: 'UTCHours', 
				utchours: 'UTCHours', utcminutes: 'UTCMinutes', utcseconds: 'UTCSeconds', utcmilliseconds: 'UTCMilliseconds'
			},
		mapPart = map[part];

	if(part == 'weeks' || part == 'utcweeks')
		amount *= 168;
	if(part == 'days' || part == 'utcdays')
		amount *= 24;
	
	this['set'+ mapPart]( this['get'+ mapPart]() + amount );

	return this;
}
  
  
/*******
 * An array of national holidays. This is used to test for the exclusion of given
 *   days. While this list is national days, you could tailor it to regional, state
 *   or given religious observances. Whatever.
 ******/
natDays = [
  {
    month: 1,
    date: 26,
    type: "national - us",
    name: "New Year's Day"
  },
  {
    month: 1,
    date: 21,
    type: "national - us",
    name: "Martin Luther King Day"
  },
  {
    month: 2,
    date: 18,
    type: "national - us",
    name: "President's Day (Washington's Birthday"
  },
  {
    month: 5,
    date: 27,
    type: "national - us",
    name: "Memorial Day"
  },
  {
    month: 7,
    date: 4,
    type: "national - us",
    name: "Independence Day"
  },
  {
    month: 9,
    date: 2,
    type: "national - us",
    name: "Labor Day"
  },
  
  {
    month: 10,
    date: 14,
    type: "national - us",
    name: "Columbus Day"
  },
  {
    month: 11,
    date: 11,
    type: "national - us",
    name: "Veteran's Day"
  },
  {
    month: 11,
    date: 29,
    type: "national - us",
    name: "Thanksgiving Day"
  },
  {
    month: 12,
    date: 25,
    type: "national - us",
    name: "Christmas Day"
  }
  
];

/******
 * This uses the national holidays array we just set, and checks a given day to see
 *   if it's in the list. If so, it returns true and the name of the holiday, if not
 *   it returns false.
 *****/
function nationalDay(date) {
    for (i = 0; i < natDays.length; i++) {
      if (date.getMonth() == (natDays[i].month-1)
          && date.getDate() == natDays[i].date) {
        return [true, natDays[i].name];
      }
    }
  return [false, null];
}

/******
 * This function takes two dates, as start and end date, and iterates through the
 *   dates between them. For each date, it checks if the current date is a week day.
 *   If it is, it then checks if it isn't a holiday. In this case, it increments
 *   the business day counter.
 ******/
function calcBusinessDays(startDate, endDate) {
  // input given as Date objects
  var iDateDiff=0, holidays = [];
    
  startDate.each(endDate, 'days', 1, function(currentDate, currentStep, thisDate){
      if(currentDate.getDay() != 0 && currentDate.getDay() != 6 ) {
        var isAHoliday = nationalDay(currentDate);
          if(!isAHoliday[0]){
            iDateDiff += 1;
          } else {
            holidays.push(isAHoliday[1]);
          }
      }
   });
   return {count: iDateDiff, holidays: holidays};

};

$(function(){
  var results, exclusions;

$( "#startDate" ).datepicker({
      defaultDate: "+1w",
      changeMonth: true,
      numberOfMonths: 3,
      onClose: function( selectedDate ) {
        $( "#endDate" ).datepicker( "option", "minDate", selectedDate );
      }
    });
    $( "#endDate" ).datepicker({
      defaultDate: "+1w",
      changeMonth: true,
      numberOfMonths: 3,
      onClose: function( selectedDate ) {
        $( "#startDate" ).datepicker( "option", "maxDate", selectedDate );
      }
    });
    $("#calculateMe").on("click", function(){
      var startDate = new Date($("#startDate").val()),
          endDate = new Date($("#endDate").val() );
      // Calculate the number of business days. This returns an object, with
      //  two members: count and holidays
      results = calcBusinessDays(startDate, endDate);
      exclusions = "Excluded weekends";
      if (results.holidays.length > 0) {
        // We have holidays, tell the user about them...
        exclusions += " and the following holidays: ";
        for(var i=0; i<results.holidays.length; i += 1){
          exclusions += results.holidays[i]+", ";
        }
      } else {
        // No holidays.
        exclusions += ".";
      }
      $("#result").text(results.count + " business days." ).append("<p>("+exclusions+")</p>");
    });
});
&#13;
<div id="content">
    <input type="text" class="myDateClass" id="startDate"/>    
    <input type="text" class="myDateClass" id="endDate"/>
    <button id="calculateMe">How many business days?</button>
    <div id="result"></div>
</div>
&#13;
&#13;
&#13;

Fiddle