2012-07-24 60 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