3

How to convert yyyyMMddhh (2017092018) string to Date in SQL Server 2012?

Is it possible to do without using T-SQL to put the sentence into the INSERT clause?

INSERT INTO [dbo].[Table](SomeColumn) 
VALUES (CONVERT(DATETIME, '2017092018', 'yyyyMMddhh'));
marc_s
  • 732,580
  • 175
  • 1,330
  • 1,459
Evgeny Bychkov
  • 322
  • 1
  • 2
  • 11
  • `Is it possible to do without using T-SQL to put the sentence into the INSERT clause?` - I'm not sure what you're asking here... – Siyual Sep 20 '17 at 14:17
  • Create a function in sql with string parameter and return Date. You can also make your function running with different custom date formats. – OnurBulbul Sep 20 '17 at 14:18
  • Is the string always in that exact format? Always the same number of characters? – Siyual Sep 20 '17 at 14:18
  • Another question after your edit... you specifically say `DATE` twice in your question, but your example says `DATETIME`. What are you looking for? – Siyual Sep 20 '17 at 14:20
  • Possible duplicate of [Conversion failed when converting date and/or time from character string while inserting datetime](https://stackoverflow.com/questions/14119133/conversion-failed-when-converting-date-and-or-time-from-character-string-while-i) – Tab Alleman Sep 20 '17 at 14:21
  • Yes, it's always in the same format. – Evgeny Bychkov Sep 20 '17 at 14:21
  • Just saying. Tanner's solution should really be the accepted answer – John Cappelletti Sep 20 '17 at 15:23

4 Answers4

7

Example

Declare @S varchar(50)='2017092018'

Select convert(datetime,left(@S,8)) + convert(datetime,right(@S,2)+':00')

Returns

2017-09-20 18:00:00.000

If 2012+, I would suggest try_convert() just in case you have some unexpected values.

John Cappelletti
  • 79,615
  • 7
  • 44
  • 66
2

Alternate approach using STUFF:

DECLARE @val VARCHAR(25) = '2017092018';

SELECT CONVERT(DATETIME,STUFF(@val, 9, 0, ' ') + ':00')

This adds a space before the hour, then adds :00 for the minute value.

Tanner
  • 22,205
  • 9
  • 65
  • 83
1

You could use DATETIMEFROMPARTS:

DECLARE @d NVARCHAR(10)='2017092018';

SELECT DATETIMEFROMPARTS(LEFT(@d,4),SUBSTRING(@d,5,2),SUBSTRING(@d,7,2),RIGHT(@d,2),0,0,0 ) ; 

Rextester Demo

EDIT:

Another option:

DECLARE @S varchar(10)='2017092018'
SELECT CAST(LEFT(@s, 8) AS DATETIME) + RIGHT(@s,2)/24.0;

Rextester Demo2

Lukasz Szozda
  • 162,964
  • 23
  • 234
  • 275
1

Here is yet another approach to this. It is similar to what John Cappelletti posted.

Declare @S varchar(50)='2017092018'

Select dateadd(hour, convert(int, right(@s, 2)), left(@s, 8))
Sean Lange
  • 33,028
  • 3
  • 25
  • 40