2012-09-10 16 views
36

Come sarebbe possibile estrarre la parte relativa all'ora di un campo DateTime in SQL? Per il mio progetto che ho per restituire i dati che ha un timestamp di 5:00 di un campo datetime non importa quale sia la data èTempo parte di un campo DateTime in SQL

+2

Questa domanda è stata posta molte volte: si prega di utilizzare la ricerca. [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

risposta

30

In SQL Server se è necessario solo il hh:mi, è possibile utilizzare:

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

Che non viene formattato correttamente per i minuti <10 ovvero 10 : 09 risulta 10: 9 – LarryBud

+0

@LarryBud Ho risolto il problema in una modifica - ha aggiunto la funzione RIGHT chiama. –

41

Ciò restituirà il tempo di sola

Per SQL Server:

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

Spiegazione:

getDate() sta dando data e ora correnti.
108 sta formattando/fornendoci la parte richiesta in questo caso.
varchar(8) ci fornisce il numero di caratteri da quella parte.
come:
Se hai scritto varchar(7) lì, che vi darà 00:00:0
Se hai scritto varchar(6) lì, che vi darà 00:00:
Se hai scritto varchar(15) lì, sarà ancora vi darà 00:00:00 perché è dare uscita della porzione di tempo giusto. SQLFiddle Demo

Per MySQL:

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

SQLFiddle Demo

+1

[visita questo] (http://www.sql-server-helper.com/tips/date-formats.aspx) per ulteriore assistenza. – Sohail

22

Se si desidera solo l'ora della vostra datetime, quindi è possibile utilizzare DATEPART() - SQL Server:

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

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

In SQL Server 2008+ è possibile CAST() come il tempo:

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

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

Questo è ottimo, consente calcoli di differenza di tempo facili come questo: SELECT DATEDIFF (mi, CAST (@SomeDate AS TIME), CAST (@AnotherDate AS TIME)) – Dave

2

"Per il mio progetto, ho per restituire i dati che hanno un timestamp di 5pm di un campo DateTime, non importa quale sia la data. "

Quindi penso che volevi dire che avevi bisogno della data, non del tempo. Si può fare qualcosa di simile per ottenere un appuntamento con 05:00 come il tempo:

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

Prova questa in SQL Server 2008:

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

Se si vuole prendere un valore datetime casuale e regolarlo quindi il componente orario è 5pm, quindi in SQL Server 2008 ci sono diversi modi. Innanzitutto è necessario iniziare la giornata (ad es., 2011-09-30 00: 00: 00.000).

  • Una tecnica che funziona per tutte le versioni di Microsoft SQL Server e tutte le versioni di Sybase è quello di utilizzare convert/3 per convertire il valore datetime ad un varchar che manca di una componente di tempo e poi di nuovo in un valore datetime:

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

dà Quanto sopra si avvia-of-day per il giorno corrente.

  • In SQL Server 2008, però, si può dire qualcosa di simile:

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

    che rischia più veloce.

Una volta avviato, arrivare alle 17 è facile. Basta aggiungere 17 ore per il vostro valore iniziale della giornata:

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

Questo dovrebbe spogliare la parte relativa alla data:

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

e restituire un datetime con una data predefinita di 1900-01-01.

+0

seconda espressione ROUND UP data, è necessario utilizzare 'floor (convert (float))', non 'convert (int)' 'convert (datetime, convert (float, ok_date_added) -floor (convert (float, ok_date_added))) ' – Rijen

5

So che questa è una vecchia questione, ma dal momento che le altre risposte tutte

  • stringhe di ritorno (piuttosto che datetimes),
  • contare sulla rappresentazione interna delle date (conversione di galleggiare, int, e indietro) o
  • richiede SQL Server 2008 o oltre,

ho pensato di aggiungere un opzione "puro", che richiede solo operazioni datetime e lavora con SQL Server 2005 +:

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

Questo calcola la differenza (in giorni interi) tra data zero (1900-01-01) e la data proposta e quindi sottrae il numero di giorni dalla data proposta, modificando così la sua componente di data a zero.

+1

Fresco, ma con SQL Server 2008 e versioni successive è più semplice pronunciare" SELECT CAST (mydatetime AS time ") (derivato da altre risposte). –

+0

@JeppeStigNielsen A meno che non si utilizzi DATETIMEOFFSET, CAST (ora mydatetime AS) non funzionerà. – JumpingJezza

+0

@JumpingJezza Non sei sicuro di cosa intendi. Ho una tabella 'mytable' con una colonna' mydatetime' che ha il tipo '(datetime, not null)', e per me funziona bene: '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

Sebbene questo codice possa rispondere alla domanda, fornendo un contesto aggiuntivo relativo a ** come ** e ** perché ** risolve il problema, migliorerebbe il valore a lungo termine della risposta. – Alexander

Problemi correlati