2012-09-10 29 views
36

如何才能在SQL中提取DateTime字段的時間部分?對於我的項目,我必須返回具有DateTime字段的下午5時的時間戳無論日期是什麼SQL中DateTime字段的時間部分

+2

此問題已被多次詢問 - 請使用搜索。 [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/2951858/extract(http://stackoverflow.com/questions/2951858/extract)(http://stackoverflow.com/questions/2951858/extract) -time-part-from-timestamp-column-in-oracle) – Bridge

回答

30

在SQL Server中,如果你只需要hh:mi,你可以使用:

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

這不會格式正確的分鐘<10即10 :09結果10:9 – LarryBud

+0

@LarryBud我修正了在編輯 - 添加RIGHT函數調用。 –

41

數據這將返回時間只有

對於SQL Server:

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

說明:

getDate()給出當前日期和時間。
108正在格式化/給我們所需的部分,即在這種情況下的時間。
varchar(8)給出了該部分的字符數。
像:
如果你寫varchar(7)那裏,它會給你00:00:0
如果你寫varchar(6)那裏,它會給你00:00:
如果你寫varchar(15)那裏,它還是會給予你00:00:00,因爲它是給只是時間部分的輸出。 SQLFiddle Demo

對於MySQL:

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

SQLFiddle Demo

+1

[訪問此](http://www.sql-server-helper.com/tips/date-formats.aspx)獲得更多幫助。 – Sohail

22

如果只希望你的日期時間的小時,那麼你可以使用DATEPART() - SQL服務器:

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

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

在SQL Server 2008+可以CAST()隨着時間:

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

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

這很好,它可以很容易地計算這樣的時間差異: SELECT DATEDIFF(mi,CAST(@SomeDate AS TIME),CAST(@AnotherDate AS TIME)) – Dave

2

「對於我的項目,我有返回DateTime字段的時間戳爲5pm的數據,無論日期是什麼。「

所以我認爲你的意思是你需要日期而不是時間。你可以做這樣的事情得到一個日期爲5:00的時間:

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

在SQL Server 2008中試試這個:

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

如果你想採取隨機時間值,並將其調整所以時間組件是5pm,那麼在SQL Server 2008中有很多方法。首先,您需要每天的開始時間(例如,2011-09-30 00:00:00:00)。

  • 一種技術,適用於Microsoft SQL Server的所有版本,以及如Sybase的所有版本的工作原理是利用convert/3到datetime值轉換爲一個缺乏時間組件,然後回一個日期時間值VARCHAR:

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

以上爲您提供了開始的日當天。

  • 在SQL Server 2008,不過,你可以說這樣的事情:

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

    這很可能更快。

一旦你有了一天的開始,下午5點很容易。只需添加17小時,啓動的天你的價值:

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

這應該剝去日期部分:

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

,並用1900-01-01默認日期返回日期時間。

+0

第二個表達式ROUND UP日期,需要使用'floor(convert(float))',而不是'convert(int)' 'convert(datetime,convert(float,ok_date_added)-floor(convert(float,ok_date_added))) ' – Rijen

5

我知道這是一個老問題,但由於其他的答案都

  • 返回字符串(而不是日期時間),
  • 依靠日期的內部表示(轉換爲float,int和背部)或
  • 需要SQL Server 2008或以後,

我想我會添加一個「純粹」的選項,只需要日期時間的操作和使用SQL Server的作品2005+:

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

此計算日期零(1900-01-01)和給定的日期之間的差(在整個天),然後減去從給定日期的是天數,從而它的日期分量設置爲零。

+1

很酷,但對於SQL Server 2008及更高版本,更容易說'SELECT CAST(mydatetime AS time)'(從其他答案中推斷出來)。 –

+0

@JeppeStigNielsen除非使用DATETIMEOFFSET,否則CAST(mydatetime AS時間)將不起作用。 – JumpingJezza

+0

@JumpingJezza不確定你的意思。我有一個'mytable'表,其列'mydatetime'的類型爲'(datetime,not null)',對我來說這工作正常:'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

雖然這段代碼可能回答這個問題,但提供關於**如何**和**爲什麼**解決問題的其他上下文將提高​​答案的長期價值。 – Alexander

相關問題