如何在SQL Server中将自定义字符串转换为日期

3

如何将 yyyyMMddhh2017092018)字符串转换为 SQL Server 2012 中的 Date

是否可以不使用 T-SQL 将该语句放入 INSERT 子句中来实现?

INSERT INTO [dbo].[Table](SomeColumn) 
VALUES (CONVERT(DATETIME, '2017092018', 'yyyyMMddhh'));

创建一个带有字符串参数并返回日期的SQL函数。您还可以使用不同的自定义日期格式使函数运行。 - OnurBulbul
该字符串格式总是精确的吗?字符数始终相同吗? - Siyual
在你的编辑之后还有一个问题... 你在问题中特别提到了 DATE 两次,但是你的示例中却是 DATETIME。你想要什么? - Siyual
可能是[在插入日期时间时将字符转换为字符串失败]的重复问题(https://dev59.com/0WYq5IYBdhLWcg3w4Edx)。 - Tab Alleman
是的,它总是以相同的格式出现。 - Evgeny Bychkov
显示剩余2条评论
4个回答

7

例子

Declare @S varchar(50)='2017092018'

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

返回值

2017-09-20 18:00:00.000

如果你使用的是2012或更新版本,建议使用try_convert()函数以防出现意外值。

1
+1。我不想发表一个相反的答案,但我想到了一种不同的方法。dateadd(hour, convert(int, right(@s, 2)), left(@s, 8)) - Sean Lange
@SeanLange 发布吧!这就是SO的魅力... 选项。 - John Cappelletti
谢谢,但是我预料之中没有按照掩码将字符串转换成日期的方法。=( - Evgeny Bychkov
1
旧帖子,但仍然无法抗拒地想知道,为什么SQL Server不支持使用标准语法,例如使用格式字符串cast('1-1-2021','d-m-yyyy')。或者它已经存在了吗? - sjd
1
@sjd 看起来像是错失的机会。 - John Cappelletti

2

使用STUFF的替代方法:

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

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

这将在小时前添加一个空格,然后为分钟值添加:00


1
已经+1了...应该被接受为答案。我卡在了我的初始想法上。 - John Cappelletti

1
你可以使用 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演示

编辑:

另一个选项:

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

Rextester演示2


1

这里有另一种方法来解决这个问题。它类似于John Cappelletti发布的方法。

Declare @S varchar(50)='2017092018'

Select dateadd(hour, convert(int, right(@s, 2)), left(@s, 8))

1
Select CAST(left(@s, 8) AS DATETIME) + RIGHT(@s,2)/24.0; - Lukasz Szozda

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