2010-05-20 15 views

Respuesta

3

Este código debería funcionar:

 int ticksInMillisecond = 10000; 
     DateTime t1 = DateTime.Now; 
     DateTime t2 = new DateTime(t1.Ticks/ticksInMillisecond * ticksInMillisecond); 

Pero teniendo en cuenta cuestión de precisión de SQL Server, preferiría trunca a dos dígitos después de la segunda:

 int precisionTicks = 100000; 
     DateTime t1 = DateTime.Now; 
     DateTime t2 = new DateTime(t1.Ticks/precisionTicks * precisionTicks); 
11

Un poco tarde a la fiesta, pero hay aquí una solución, basada en los documentos de SQL Server para el tipo de datos datetime para diferentes versiones de SQL Server:

Para cualquier valor de fecha/hora determinada, esto debería darle exactamente el mismo valor que SQL Server:

public static class DateTimeExtensions 
{ 
            // milliseconds modulo 10: 0 1 2 3 4 5 6 7 8 9 
    private static readonly int[] OFFSET     = { 0 , -1 , +1 , 0 , -1 , +2 , +1 , 0 , -1 , +1 } ; 
    private static readonly DateTime SQL_SERVER_DATETIME_MIN = new DateTime(1753 , 01 , 01 , 00 , 00 , 00 , 000) ; 
    private static readonly DateTime SQL_SERVER_DATETIME_MAX = new DateTime(9999 , 12 , 31 , 23 , 59 , 59 , 997) ; 

    public static DateTime RoundToSqlServerDateTime(this DateTime value) 
    { 
     DateTime dt   = new DateTime(value.Year , value.Month , value.Day , value.Hour , value.Minute , value.Second , value.Millisecond) ; 
     int  milliseconds = value.Millisecond ; 
     int  t   = milliseconds % 10 ; 
     int  offset  = OFFSET[ t ] ; 
     DateTime rounded  = dt.AddMilliseconds(offset) ; 

     if (rounded < SQL_SERVER_DATETIME_MIN) throw new ArgumentOutOfRangeException("value") ; 
     if (rounded > SQL_SERVER_DATETIME_MAX) throw new ArgumentOutOfRangeException("value") ; 

     return rounded ; 
    } 
} 

No lo hará, sin embargo, funciona correctamente, para smalldatetime o los nuevos tipos de datos datetime2.

+2

¿No es esto lo mismo que 'nuevo SqlDateTime (MyDateTime) .Value'? –

+0

@Simon, sí, parece que es lo mismo. :) –

+1

+1 solo porque el código es útil para la interoperabilidad con otros lenguajes de programación. ;) –

21

Aquí es lo que quiere:

using System.Data.SqlTypes; // from System.Data.dll 

public static DateTime RoundToSqlDateTime(DateTime date) 
{ 
    return new SqlDateTime(date).Value; 
} 
3

de recomendaciones basándose en solución @RobSiklos ya que el uso de SqlDateTime de esta manera da como resultado la pérdida de información de zona horaria que el argumento 'fecha' proporciona. Encuentra sus mejores prácticas para asegurar la información de zona horaria es consistente en el momento de la conversión mediante la adición de una llamada a DateTime.SpecifyKind:

using System.Data.SqlTypes; // from System.Data.dll 

public static DateTime RoundToSqlDateTime(DateTime date) 
{ 
    return DateTime.SpecifyKind(new SqlDateTime(date).Value, date.Kind); 
} 
Cuestiones relacionadas