SQL中DateTime字段的时间部分

59

我应该如何在SQL中提取DateTime字段的时间部分?为了我的项目,我需要返回一个具有5 pm时间戳的DateTime字段数据,无论日期是什么。


2
这个问题已经被问过很多次了 - 请使用搜索功能。SQL ServerMySQLOracle - Bridge
13个回答

73

这将仅返回时间。

对于 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演示

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

SQLFiddle演示


1
请参考 visit this 获取更多帮助。 - Sohail

38

如果在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)

@LarryBud 我在编辑中修复了这个问题 - 添加了正确的函数调用。 - dodgy_coder

31

如果您只想获取日期时间中的小时部分,您可以使用 DATEPART() 函数 - SQL Server:

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

1
这很棒,它可以轻松进行时间差计算,就像这样:SELECT DATEDIFF(mi, CAST(@SomeDate AS TIME),CAST(@AnotherDate AS TIME)) - Dave

10

我知道这是一个老问题了,但因为其他答案:

  • 返回字符串(而不是日期时间)
  • 依赖于日期的内部表示(转换为浮点数、整数,再转回来)或者
  • 需要SQL Server 2008或更高版本。

因此,我想添加一个“纯净”选项,它只需要日期时间操作,并且适用于SQL Server 2005+:

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

这个函数计算给定日期与零日期(1900年1月1日)之间的差值(以整天为单位),然后从给定日期中减去这些天数,从而将其日期成分设置为零。


4
使用SQL Server 2008及更高版本,可以更容易地使用 SELECT CAST(mydatetime AS time) 表达同样的意思(从其他答案推断得出)。 - Jeppe Stig Nielsen
@JeppeStigNielsen 除非您使用DATETIMEOFFSET,否则CAST(mydatetime AS time)将无法工作。 - JumpingJezza
@JumpingJezza 不太确定你的意思。我有一个名为 mytable 的表,其中有一列名为 mydatetime,类型为 (datetime, not null),对我来说这很好用:SELECT CAST(mydatetime AS time) AS TimePart, * FROM mytable - Jeppe Stig Nielsen
@JeppeStigNielsen 哎呀,你说得对!实际上错误出在我试图将它添加到日期上。 - JumpingJezza
1
@JeppeStigNielsen 我发现,如果你想获得例如每日班次结束时间的平均值,将DATETIME转换为TIME是无效的,因为在内部SQL Server(我使用的是2019版本)似乎仍然保留DATETIME表示形式。最终你会得到一个看起来像是DATETIME值平均值而不是仅有TIME组成部分的平均值。通过将所有日期部分设置为相同,平均时间就可以工作了。还请注意,如果查看SELECT的输出,“零”日期组件部分将显示为日期纪元开始,即“1900-01-01”。 - z0lo
显示剩余2条评论

8

在SQL Server 2008中尝试以下方法:

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

如果你想获取一个随机的日期时间值,并将其调整为下午5点,则在SQL Server 2008中有多种方法。首先,你需要获取当天的起始时间(例如,2011年9月30日00:00:00.000)。

  • One technique that works for all versions of Microsoft SQL Server as well as all versions of Sybase is to use convert/3 to convert the datetime value to a varchar that lacks a time component and then back into a datetime value:

    select convert(datetime,convert(varchar,current_timestamp,112),112)
    
以上内容提供了当前日期的开头时间。
  • In SQL Server 2008, though, you can say something like this:

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

    which is likely faster.

一旦您确定了起始时间,那么到下午5点就轻松了。只需将17小时添加到起始时间值即可:

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

6

注意,从 MS SQL 2012 开始,您可以使用 FORMAT(value,'format')

例如:WHERE FORMAT(YourDatetime,'HH:mm') = '17:00'


但是请尝试一下它的性能,因为我刚刚经历了FORMAT()非常慢的惊人情况,遗憾的是,在仅有100行数据的情况下,无论是否使用日期格式,时间差达到了2分钟对比5秒钟。这很令人困惑,因为我以前从未遇到过这个问题。 - AjV Jsy

2

在这种情况下,您可以使用CONVERT(TIME,GETDATE())

INSERT INTO infoTbl
(itDate, itTime)
VALUES (GETDATE(),CONVERT(TIME,GETDATE()))

或者如果您想打印它或返回该时间,请使用以下方式:
DECLARE @dt TIME
SET @dt = CONVERT(TIME,GETDATE())
PRINT @dt

1
这是正确的答案。我很惊讶早先没有给出这个答案,因为这种数据类型自 SQL Server 2008 就已经存在了,比问题提出的时间要早得多。 - Ryan

2

选择将getdate()转换为time(0)格式:

返回结果示例:15:19:43

将getdate()替换为您想从中提取时间的日期时间即可!


选择CAST(GETDATE() AS TIME)没有刻度会更准确...虽然答案更好 :) - Adam

2

"对于我的项目,我需要返回一个日期时间字段的时间戳为下午5点的数据,无论日期是什么。"

所以我认为你想要的是日期,而不是时间。您可以通过以下方式获取时间为5:00的日期:

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

2

这将去掉日期部分:

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

并返回一个默认日期为 1900-01-01 的日期时间。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接