Dates as Numbers and Number of Days

 
 
Some of the leading ERP solutions on the market persist dates in databases as integer numbers.
 
In these cases, the integer number that represents a given date is a function of the year of the date and of the number of days since the beginning of the year.
 
If you manipulate dates from within the tools of the ERP solution, you always "see" dates.
 
But if you use the ETL tools of the database vendor to extract data, you get integer numbers instead of dates.
 
To be able to resolve this problem in .NET, we need to design two services:
 
One service that returns the number of days since the beginning of the year, for a given date, and another service that returns the corresponding date to the number of days (the inverse service).
 
We will implement the solution as a utility (a class that only has static or shared methods).
 
In .NET, it is important to appreciate the subtle differences between DateTime objects (a coordinate or point in the time axis) and TimeSpan objects (a delta between two points or coordinates in the time axis).
 
The number of days is a concept in line with TimeSpan objects, but can use TimeSpan concepts to represent DateTime objects within certain reference frameworks (for instance, within the dates of a given year).
 
In Sample Code 1, the utility is the Class NumberOfDaysInYear.
 
 
 
Fechas como Números y Número de Días
 
Algunas de las soluciones ERP líderes del mercado persisten las fechas en bases de datos como números enteros.
 
En estos casos, el número entero que representa a una fecha dada es una función del año de la fecha y del número de días desde el comienzo del año.
 
Si se manipulan fechas desde dentro de las herramientas de la solución ERP, siempre se "ven" fechas.
 
Pero si se usan las herramientas ETL del proveedor de base de datos para extraer datos, se tienen números enteros en vez de fechas.
 
A fin de resolver este problema en .NET, necesitamos diseñar dos servicios:
 
Un servicio que retorna el número de días desde el comienzo del año, para una fecha dada, y otro servicio que retorna la fecha que se corresponde con el número de días (el servicio inverso).
 
Vamos a implementar la solución como una utility (una clase que sólo tiene métodos static o shared).
 
En .NET, es importante poder apreciar las sutiles diferencias entre objetos DateTime (una coordenada o punto en el eje del tiempo) y objetos TimeSpan (un delta entre dos puntos o coordenadas en el eje del tiempo).
 
El número de días es un concepto en línea con objetos TimeSpan, pero se pueden usar conceptos TimeSpan para representar objetos DateTime dentro de ciertos marcos de referencia (por ejemplo, dentro de las fechas de un año dado).
 
En Sample Code 1, la utility es la clase NumberOfDaysInYear.
 
 
Sample Code 1
using System;
namespace TestNumberOfDaysInYear
{
 
 
 /// <summary>
 /// Description of NumberOfDaysInYear.
 /// </summary>
 public class NumberOfDaysInYear
 {
  
  
  
  // Method GetNumberOfDaysInYear: it returns the number of days
  // since the beginning of the year for a given date.
  // (it returns the value of the DayOfYear property).
  //
  // Metodo GetNumberOfDaysInYear: retorna el numero de dias 
  // desde el comienzo del año para una fecha dada.
  // (este retorna el valor de la propiedad DayOfYear).
  public static int GetNumberOfDaysInYear(System.DateTime _date)
  {
   
   
   return _date.DayOfYear;
   
  
   
  }
  
  // Method GetDateFromDays: it returns the date that corresponds to a number
  // of days since the beginning of the year.
  // (it uses the method AddDays from DateTime to determine the date).
  //
  // Metodo GetDateFromDays: retorna la fecha que corresponde con una
cantidad
  // de dias desde el comienzo del año.
  // (usa el metodo AddDays de DateTime para determinar la fecha).
  public static DateTime GetDateFromDays(int year, int days)
  {
  
   DateTime aDate = new DateTime(year, 1, 1);
   
   DateTime retDate = aDate.AddDays( (double) days-1 );
   
   
   return retDate;
   
  }
  
 }
 
 
 
 class MainClass
 {
  public static void Main()
  {
   
   System.DateTime oneDate =  System.DateTime.Now;
   
   System.DateTime otherDate;
   
   
   
   
   otherDate = NumberOfDaysInYear.GetDateFromDays(oneDate.Year,
NumberOfDaysInYear.GetNumberOfDaysInYear(oneDate));
   
   // Original date
   //
   // Fecha original
   Console.WriteLine("{0}", oneDate.ToString("dd/MM/yyyy"));
   
   // Number of days for the original date.
   //
   // Cantidad de dias para la fecha original.
   Console.WriteLine("{0}",
NumberOfDaysInYear.GetNumberOfDaysInYear(oneDate));
   
   // Reconstructed date from days.
   //
   // Fecha reconstruida desde la cantidad de dias.
   Console.WriteLine("{0}", otherDate.ToString("dd/MM/yyyy"));
   
   
  }
 }
}
 
Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s