2012-09-10 21 views
36

¿Cómo podría extraer la parte de tiempo de un campo DateTime en SQL? Para mi proyecto tengo que devolver los datos que tiene una marca de tiempo de 17:00 de un campo DateTime no importa lo que la fecha esParte del tiempo de un campo DateTime en SQL

+2

Esta pregunta se ha hecho muchas veces: utilice la búsqueda. [SQL Server] (http://stackoverflow.com/questions/3201432/how-to-get-time-part-from-sql-server-2005-datetime-in-hhmm-tt-format), [MySQL] (http://stackoverflow.com/questions/12337195/how-to-part-date-and-time-from-datetime-in-mysql), [Oracle] (http://stackoverflow.com/questions/2951858/extract -time-part-from-timestamp-column-in-oracle) – Bridge

Respuesta

30

En SQL Server si necesita sólo el hh:mi, puede utilizar:

DECLARE @datetime datetime 

SELECT @datetime = GETDATE() 

SELECT RIGHT('0'+CAST(DATEPART(hour, @datetime) as varchar(2)),2) + ':' + 
     RIGHT('0'+CAST(DATEPART(minute, @datetime)as varchar(2)),2) 
+1

Eso no formatea correctamente por minutos <10, es decir, 10 : 09 resulta 10: 9 – LarryBud

+0

@LarryBud lo arreglé en una edición - agregué las llamadas a la función DERECHA. –

41

Esto devolverá el tiempo de sólo

Para SQL Server:

SELECT convert(varchar(8), getdate(), 108) 

Explicación:

getDate() indica la fecha y la hora actuales.
108 está formateando/dándonos la porción requerida, es decir, el tiempo en este caso.
varchar(8) nos da la cantidad de caracteres de esa porción.
igual:
Si usted escribió varchar(7) allí, se le dará 00:00:0
Si usted escribió varchar(6) allí, se le dará 00:00:
Si usted escribió varchar(15) allí, todavía le dará 00:00:00 porque es dar salida de solo la porción de tiempo. SQLFiddle Demo

Para MySQL:

SELECT DATE_FORMAT(NOW(), '%H:%i:%s') 

SQLFiddle Demo

+1

[visite esto] (http://www.sql-server-helper.com/tips/date-formats.aspx) para obtener más ayuda. – Sohail

22

Si desea que sólo la hora de su fecha y hora, entonces se puede utilizar DATEPART() - SQL Server:

declare @dt datetime 
set @dt = '2012-09-10 08:25:53' 

select datepart(hour, @dt) -- returns 8 

En SQL Server 2008+ puede CAST() como el tiempo:

declare @dt datetime 
set @dt = '2012-09-10 08:25:53' 

select CAST(@dt as time) -- returns 08:25:53 
+0

Esto es genial, permite cálculos de diferencia de tiempo fácil como este: SELECCIONAR DATEDIFF (mi, CAST (@SomeDate AS TIME), CAST (@AnotherDate AS TIME)) – Dave

2

"Para mi proyecto, no tengo para devolver datos que tienen una marca de tiempo de 5pm de un campo DateTime, sin importar la fecha ".

Así que creo que lo que usted quiso decir es que necesitaba la fecha, no el momento. Usted puede hacer algo como esto para conseguir una cita con 5:00 como el tiempo:

SELECT CONVERT(VARCHAR(10), GetDate(), 110) + ' 05:00:00' 
7

Prueba esto en SQL Server 2008:

select * 
from some_table t 
where convert(time,t.some_datetime_column) = '5pm' 

Si desea tomar un valor de fecha y hora al azar y ajustarlo entonces el componente de tiempo es 5pm, luego en SQL Server 2008 hay varias maneras. Primero necesita el comienzo del día (p. Ej., 2011-09-30 00: 00: 00,000).

  • Una técnica que funciona para todas las versiones de Microsoft SQL Server, así como todas las versiones de Sybase es utilizar convert/3 para convertir el valor de fecha y hora a un varchar que carece de un componente de tiempo y luego de nuevo en un valor de fecha y hora:

    select convert(datetime,convert(varchar,current_timestamp,112),112) 
    

en el cuadro anterior se inicia del día para el día actual.

  • En SQL Server 2008, sin embargo, se puede decir algo como esto:

    select start_of_day =    t.some_datetime_column 
            - convert(time, t.some_datetime_column) , 
    from some_table t 
    

    que probablemente más rápido.

Una vez que tiene el comienzo del día, llegar a las 5 pm es fácil. Sólo tiene que añadir 17 horas a su valor de inicio del día:

select five_pm = dateadd(hour,17, t.some_datetime_column 
        - convert(time,t.some_datetime_column) 
        ) 
from some_table t 
2

Esto debe despojar la parte de fecha:

select convert(datetime,convert(float, getdate()) - convert(int,getdate())), getdate() 

y devolver una fecha y hora con una fecha predeterminada de 1900-01-01.

+0

segunda expresión REDONDEAR fecha, necesita usar 'piso (convertir (float))', no 'convertir (int)' 'convertir (datetime, convert (float, ok_date_added) -floor (convertir (float, ok_date_added))) ' – Rijen

5

Sé que esto es una cuestión de edad, pero ya que las otras respuestas todos

  • cadenas de retorno (en lugar de datetimes),
  • baso en la representación interna de las fechas (conversión a flote, int y espalda) o
  • requiere SQL Server 2008 o más allá,

pensé que me gustaría añadir una opción de "puro", que sólo requiere operaciones de fecha y hora y trabaja con SQL Server 2005 +:

SELECT DATEADD(dd, -DATEDIFF(dd, 0, mydatetime), mydatetime) 

Esto calcula la diferencia (en días enteros) entre la fecha de cero (1900-01-01) y la fecha dada y luego resta ese número de días desde la fecha dada, estableciendo así su componente de fecha a cero.

+1

Genial, pero con SQL Server 2008 y posterior es más fácil decir' SELECT CAST (mydatetime AS time) '(deducido de otras respuestas). –

+0

@JeppeStigNielsen A menos que esté utilizando DATETIMEOFFSET, entonces CAST (mydatetime AS time) no funcionará. – JumpingJezza

+0

@JumpingJezza No estoy seguro de lo que quiere decir. Tengo una tabla 'mytable' con una columna' mydatetime' que tiene el tipo '(datetime, not null)', y para mí esto funciona bien: 'SELECT CAST (mydatetime AS time) AS TimePart, * FROM mytable' –

0
SELECT DISTINCT 
       CONVERT(VARCHAR(17), A.SOURCE_DEPARTURE_TIME, 108) 
FROM 
     CONSOLIDATED_LIST AS A 
WHERE 
     CONVERT(VARCHAR(17), A.SOURCE_DEPARTURE_TIME, 108) BETWEEN '15:00:00' AND '15:45:00' 
+0

Si bien este código puede responder a la pregunta, proporcionar contexto adicional con respecto a ** cómo ** y ** por qué ** resuelve el problema mejoraría el valor a largo plazo de la respuesta. – Alexander

Cuestiones relacionadas