如何从自定义格式字符串创建日期时间?

时间:2011-07-06 19:11:43

标签: sql sql-server sql-server-2005

我将日期时间值存储在字段中作为字符串。它们存储为字符串,因为它们是如何通过电线而原始值在其他地方使用。

对于报告,我想将自定义格式字符串(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

7 个答案:

答案 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