我将日期时间值存储在字段中作为字符串。它们存储为字符串,因为它们是如何通过电线而原始值在其他地方使用。
对于报告,我想将自定义格式字符串(yyyymmddhhmm)转换为视图中的日期时间字段。我的报告将使用视图并使用实际日期时间值。这将使涉及日期范围的查询更加容易。
如何执行此转换?我创建了视图但找不到将字符串转换为日期时间的方法。
谢谢!
更新1 -
这是我到目前为止的SQL。当我尝试执行时,我收到转换错误“从字符串转换日期时转换失败。”
如何处理缺少时间部分的空值和日期时间字符串(只是yyyymmdd)?
SELECT
dbo.PV1_B.PV1_F44_C1 AS ArrivalDT,
cast(substring(dbo.PV1_B.PV1_F44_C1, 1, 8)+' '+substring(dbo.PV1_B.PV1_F44_C1, 9, 2)+':'+substring(dbo.PV1_B.PV1_F44_C1, 11, 2) as datetime) AS ArrDT,
dbo.MSH_A.MSH_F9_C2 AS MessageType,
dbo.PID_A.PID_F3_C1 AS PRC,
dbo.PID_A.PID_F5_C1 AS LastName,
dbo.PID_A.PID_F5_C2 AS FirstName,
dbo.PID_A.PID_F5_C3 AS MiddleInitial,
dbo.PV1_A.PV1_F2_C1 AS Score,
dbo.MSH_A.MessageID AS MessageId
FROM dbo.MSH_A
INNER JOIN dbo.PID_A ON dbo.MSH_A.MessageID = dbo.PID_A.MessageID
INNER JOIN dbo.PV1_A ON dbo.MSH_A.MessageID = dbo.PV1_A.MessageID
INNER JOIN dbo.PV1_B ON dbo.MSH_A.MessageID = dbo.PV1_B.MessageID
答案 0 :(得分:3)
根据here,从CONVERT
格式到日期时间没有开箱即用的yyyymmddhhmm
。
您的策略是将字符串解析为文档中提供的格式之一,然后将其转换。
答案 1 :(得分:2)
declare @S varchar(12)
set @S = '201107062114'
select cast(substring(@S, 1, 8)+' '+substring(@S, 9, 2)+':'+substring(@S, 11, 2) as datetime)
结果:
2011-07-06 21:14:00.000'
首先将您的日期字符串更改为20110706 21:14
。无论SET DATEFORMAT设置如何,日期格式yyyymmdd作为字符串都可以安全地转换为SQL Server中的datetime。
编辑:
declare @T table(S varchar(12))
insert into @T values('201107062114')
insert into @T values('20110706')
insert into @T values(null)
select
case len(S)
when 12 then cast(substring(S, 1, 8)+' '+substring(S, 9, 2)+':'+substring(S, 11, 2) as datetime)
when 8 then cast(S as datetime)
end
from @T
结果:
2011-07-06 21:14:00.000
2011-07-06 00:00:00.000
NULL
答案 2 :(得分:1)
您可以使用CAST
or CONVERT
。
网站示例:
-G。使用CAST和CONVERT 日期时间数据
以下示例显示 当前日期和时间,使用CAST 将当前日期和时间更改为a 字符数据类型,然后使用 CONVERT显示日期和时间 ISO 8901格式。
SELECT GETDATE() AS UnconvertedDateTime, CAST(GETDATE() AS nvarchar(30)) AS UsingCast, CONVERT(nvarchar(30), GETDATE(), 126) AS UsingConvertTo_ISO8601; GO
这是结果集。
UnconvertedDateTime UsingCast UsingConvertTo_ISO8601 ----------------------- ------------------------------ ------------------------------ 2006-04-18 09:58:04.570 Apr 18 2006 9:58AM 2006-04-18T09:58:04.570 (1 row(s) affected)
答案 3 :(得分:1)
通常,您可以使用以下代码:
SELECT convert(datetime,'20110706',112)
如果需要强制SQL Server使用自定义格式字符串,请使用以下代码:
SET DATEFORMAT ymd
SELECT convert(datetime,'20110706')
答案 4 :(得分:1)
DECLARE @d VARCHAR(12);
SET @d = '201101011235';
SELECT CONVERT(SMALLDATETIME, STUFF(STUFF(@d,9,0,' '),12,0,':'));
请注意,通过使用不适当的数据类型存储日期/时间数据,您无法防止错误数据在此处结束。所以这样做可能更安全:
WITH x(d) AS
(
SELECT d = '201101011235'
UNION SELECT '201101011267' -- not valid
UNION SELECT NULL -- NULL
UNION SELECT '20110101' -- yyyymmdd only
),
y(d, dt) AS
(
SELECT d,
dt = STUFF(STUFF(LEFT(d+'000000',12),9,0,' '),12,0,':')
FROM x
)
SELECT CONVERT(SMALLDATETIME, dt), ''
FROM y
WHERE ISDATE(dt) = 1 OR d IS NULL
UNION
SELECT NULL, d
FROM y
WHERE ISDATE(dt) = 0 AND d IS NOT NULL;
答案 5 :(得分:1)
一个班轮:
declare @datestring varchar(255)
set @datestring = '201102281723'
select convert(datetime, stuff(stuff(@datestring,9,0,' '),12,0,':') , 112 )
结果:
2011-02-28 17:23:00.000
答案 6 :(得分:-3)
DECLARE @test varchar(100) = '201104050800'
DECLARE @dt smalldatetime
SELECT @dt = SUBSTRING(@test, 5, 2)
+ '/' + SUBSTRING(@test, 7, 2) + '/'
+ SUBSTRING(@test, 1, 4) + ' ' + SUBSTRING(@test, 9, 2)
+ ':' + SUBSTRING(@test, 11, 2)
SELECT @dt
输出:
2011-04-05 08:00:00