2012-07-24 63 views
5

我想在当天的下午4点30分。硬编码这种方式不起作用:在特定时间使用今天的日期构建DateTime

SELECT '07242012 16:30:00.000' 

这被证明比我想象的要困难。我如何解决这个问题?

+0

在未来,如果你meantion你使用的是什么版本的SQL Server它可以是非常有帮助的。 – 2012-07-24 17:01:27

+0

啊,会更新这个问题来反映这一点。 – 2012-07-25 16:47:39

+0

我通过标记更改了编辑以指示版本。比试图找到隐藏在问题中的版本信息更容易。 – 2012-07-25 16:48:29

回答

15

的SQL Server2005分之2000:

SELECT DATEADD(MINUTE, 30, DATEADD(HOUR, 16, DATEDIFF(DAY, 0, CURRENT_TIMESTAMP))); 

-- or 

SELECT DATEADD(MINUTE, (16*60) + 30, DATEDIFF(DAY, 0, CURRENT_TIMESTAMP)) 

-- or 

SELECT CONVERT(DATETIME, CONVERT(CHAR(9), CURRENT_TIMESTAMP, 112) + '16:30'); 

的SQL Server 2008+:

SELECT CONVERT(DATETIME, CONVERT(DATE, CURRENT_TIMESTAMP)) + '16:30'; 

的SQL Server 2012:

SELECT SMALLDATETIMEFROMPARTS(YEAR(GETDATE()), MONTH(GETDATE()), DAY(GETDATE()), 16, 30); 
+0

什么,没有SQL 7? 6.5? :) – 2012-07-24 17:11:54

+0

@NathanSkert我认为第一个代码块也可以在7.0/6.5中工作,但我并不打算将一个实例放在一起来证明它。 :-) – 2012-07-24 19:04:25

+0

答案非常全面,谢谢Aaron! – 2012-07-25 16:48:38

0

大概最容易做的事情是投当前日期/时间到日期(剥离时间),将其重新转换为日期时间以允许使用日期时间的重载+ (plus),并最终将所需的文本时间投射到日期时间。具体如下:

select cast(cast(sysutcdatetime() as date) as datetime) + cast('16:30' as datetime) 

回报率(当2018年1月11日执行):

2018-01-11 16:30:00.000 
+0

这并没有真正回答这个问题。如果您有不同的问题,可以通过单击[提问](https://stackoverflow.com/questions/ask)来提问。您也可以[添加赏金](https://stackoverflow.com/help/privileges/set-bounties)来更多地关注这个问题。 - [来自评论](/ review/low-quality-posts/18476550) – 2018-01-10 16:22:59

+0

这看起来像是一个合理的答案,但如果你在这里添加一些解释,会更好。代码片段本身并不像解释你在做什么的段落那样有用,后面跟着说明这个想法的代码。 – Caleb 2018-01-10 16:55:12

+0

我已经扩大了答复。希望现在看起来更有价值 – 2018-01-11 09:22:56