¿Debería almacenarse un año y un mes como campos separados o como fecha? -- # campo con linq campo con sql-server campo con entity-framework campo con datetime camp codereview Relacionados El problema

Should a year and month be stored as separate fields or as a date?


8
vote

problema

Español

Tenemos una tabla con datos calculados que agrupan las ventas por producto, año y mes, para proporcionar consultas rápidas para estadísticas.

Mi colega sostiene que el año y el mes deben ser dos campos separados, porque un día no tiene sentido.

Lo quiero como un campo de fecha, porque el uso de dos campos separados conduce a un código incómodo como este

  var lastTwelveMonths = new DateTime(DateTime.Now.Year, DateTime.Now.Month, 1).AddMonths(-11); var result = data.Where(item =>     (item.Year > lastTwelveMonths.Year     || (item.Year == lastTwelveMonths.Year && item.Month >= lastTwelveMonths.Month));   

en lugar de este

  var lastTwelveMonths = new DateTime(DateTime.Now.Year, DateTime.Now.Month, 1).AddMonths(-11); var result = data.Where(item => item.YearAndMonthAsDate >= lastTwelveMonths);   

Entiendo su argumento, pero el código es más difícil de leer y hay una mayor probabilidad de errores al realizar cálculos de fecha / tiempo sin usar objetos de fecha / hora. Tampoco puedo lanzarlo a un DateTime en la consulta porque estoy usando Linq a entidades.

¿Qué método es el mejor?

Original en ingles

We have a table with calculated data that groups sales by product, year and month, to provide fast querying for statistics.

My colleague argues that the year and month should be two separate fields, because a day is meaningless.

I want it as a date field, because using two separate fields leads to awkward code like this

var lastTwelveMonths = new DateTime(DateTime.Now.Year, DateTime.Now.Month, 1).AddMonths(-11); var result = data.Where(item =>     (item.Year > lastTwelveMonths.Year     || (item.Year == lastTwelveMonths.Year && item.Month >= lastTwelveMonths.Month)); 

instead of this

var lastTwelveMonths = new DateTime(DateTime.Now.Year, DateTime.Now.Month, 1).AddMonths(-11); var result = data.Where(item => item.YearAndMonthAsDate >= lastTwelveMonths); 

I understand his argument, but the code is harder to read and there's a higher chance on bugs when doing date/time calculations without using date/time objects. I also can't cast it to a DateTime in the query because I'm using LINQ to Entities.

Which method is the better one?

              
       
       

Lista de respuestas

7
 
vote
vote
La mejor respuesta
 

En general, realmente depende de los casos de uso de sus datos. Si necesita realizar consultas utilizando el año o solo el mes, entonces reduce la complejidad en el código y las consultas al tener campos separados.

Sin embargo, si no está delimitando solo un año o solo un mes, entonces querría usar un campo de fecha.

Campos de la fecha o la cadena de la fecha (YYYYMMDD) al representar las fechas y las horas, ya que la aceleración que obtiene de los campos de un solo año / mes es pequeño con las bases de datos de hoy (asumiendo que las cosas se indexan correctamente).

 

In general it really depends on the use cases of your data. If you need to perform queries using just year or just month then you reduce complexity in the code and queries by having separate fields.

However, if you aren't bounding by just a year or just a month then you would want to use a date field.

Professionally I use date or string fields (YYYYMMDD) when representing dates and times because the speedup you get from single year/month fields is small with todays databases (assuming things are correctly indexed).

 
 
3
 
vote

Si está buscando un argumento por autoridad, considere la aversión de Microsoft a getversiox y en particular mal uso de la osversioninfoex Estructura en los cálculos que se ven sorprendentes similares. Por la analogía a las razones por las que calzan los resultados de GetVersionex para la compatibilidad del programa, aparentemente está lejos de ser muy fácil de escribir código que significa decir "después de febrero de 2010" como month > 2 && year > 2010 , cuando el código correcto es más complicado year > 2010 || (year == 2010 && month > 2) Como muestra su ejemplo.

por la falta de comprensión de las limitaciones de linq a entidades , Pensé tu El ejemplo era innecesariamente complejo, y exhibió un argumento defectuoso. Después de todo, si puede comparar con un 9988776665544332 que acaba de construir, y puede hacer la lógica compleja, ¿por qué no simplemente encapsularlo en el 9988777665544333 clase? < / p>

  var lastTwelveMonths = new DateTime(DateTime.Now.Year, DateTime.Now.Month, 1).AddMonths(-11); var result = data.Where(item => new DateTime(item.Year, item.Month, 1) >= lastTwelveMonths));   

Sin embargo, a medida que aclaró en sus comentarios a continuación, L2E no admite la creación de un 9988776665544335 de columnas separadas dentro de una expresión 9988777665544336 . En su lugar, está asignando la comparación DateTime lastTwelveMonths Fecha en las consultas de la base de datos y no puede asignar el mapeo de mi contraejemplo a las mismas consultas que se generan en su primer ejemplo.

 

If you're looking for an argument by authority, consider Microsoft's aversion to GetVersionEx and in particular misuse of the OSVERSIONINFOEX structure in calculations that look suprisingly similar. By analogy to the reasons they shim the results from GetVersionEx for program compatibility, it's apparently far to easy to write code that means to say "After February 2010" as month > 2 && year > 2010, when the correct code is the more complicated year > 2010 || (year == 2010 && month > 2) as your example shows.

Per a lack of understanding of the limitations of LINQ to entities, I thought your example was needlessly complex, and exhibited a flawed argument. After all, if you can compare to a DateTime that you've just constructed, and can do the complex logic, why not just encapsulate it back into the DateTime class?

var lastTwelveMonths = new DateTime(DateTime.Now.Year, DateTime.Now.Month, 1).AddMonths(-11); var result = data.Where(item => new DateTime(item.Year, item.Month, 1) >= lastTwelveMonths)); 

However as you clarified in your comments below, L2E does not support creating a DateTime from separate columns inside a Where expression. Instead it's mapping the comparison DateTime lastTwelveMonths date into database queries, and is unable to map from my counterexample to the same queries as generated in your first example.

 
 
         
         

Relacionados problema

5  Representando el tiempo de apertura y cierre para un negocio  ( Representing the opening and closing time for a business ) 
Tengo una clase de openclose que solo representa las horas de operación de un negocio por la apertura y el tiempo de cierre. Toma los tiempos de apertura y ci...

5  Calcular el tiempo transcurrido de los tiempos de entrada sin usar declaraciones condicionales  ( Calculate elapsed time from input times without using conditional statements ) 
Acabo de empezar la programación y nos estamos enseñando C ++. Después de nuestra 2ª conferencia, nos dieron una tarea para hacer un programa que tome dos val...

0  Valor numérico para una fecha, DataTado y Datediff  ( Numeric value for a date dateadd and datediff ) 
En MS Excel, una fecha también se representa como un valor numérico, con el 1-enero-1900 como el primer día. También en VBA hay funciones de DataLTD y Datedif...

4  Salida de una cuenta regresiva en un div  ( Outputting a countdown in a div ) 
Obtuve este código trabajando con el complemento de cuenta regresiva jQuery para tomar una entrada y salida una cadena cuenta regresiva en un div. ¿Hay una ...

2  Obtén el primer patrimonio dado por los días de semana y un tiempo de inicio  ( Get first datetime by given weekdays and a starttime ) 
En el trabajo hay un sistema de entrada donde los clientes pueden especificar los días de semana y una hora de inicio para un evento. Los días de semana son e...

10  Obteniendo la última fecha donde ocurrió un día de la semana dado  ( Getting the last date where a given week day occurred ) 
Estoy tratando de aprender un poco sobre la programación funcional y como mi herramienta, elegí F # ya que soy un desarrollador de .NET y el medio ambiente es...

10  Obteniendo tiempo actual con milisegundos  ( Getting current time with milliseconds ) 
Estoy buscando una forma más eficiente o más corta de lograr la siguiente salida utilizando el siguiente código: timeval curTime; gettimeofday(&curTime, NU...

6  Compara el último tiempo de modificación con tiempo especificado  ( Compare last modification time with specfied time ) 
Estoy escribiendo una función en Python que compara el tiempo de modificación de un archivo en Linux (usando OS.STAT) con un tiempo específico y compare las f...

8  Conversión de STD :: Chrono :: Time_Point to / from std :: string  ( Converting stdchronotime point to from stdstring ) 
Considere estas funciones que permitan convertir checkOnline.sh4 a / FROM checkOnline.sh5 Con un formato Fecha de fecha ". checkOnline.sh6 con uso:...

5  Método de cálculo del día del año  ( Day of year calculation method ) 
El ejercicio que quería resolver es de aquí . Copiando desde esa página: public static int dayOfYear(int month, int dayOfMonth, int year) { if (month...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos