【问题标题】:How to convert the below text string into a date type using SQL Server 2016如何使用 SQL Server 2016 将以下文本字符串转换为日期类型
【发布时间】:2019-04-14 04:58:57
【问题描述】:
ActivateDate        ShipDate                Month   Month_Length    Day-2c  Day-2c_Length   YEAR-201x   SHIPDateConcatenate     ActivateDateConcatenate
NULL                6/12/2018 12:00:00 AM   6       1               12      2               2018        6-12-2018               NULL
NULL                6/12/2018 12:00:00 AM   6       1               12      2               2018        6-12-2018               NULL
NULL                6/12/2018 12:00:00 AM   6       1               12      2               2018        6-12-2018               NULL
NULL                6/12/2018 12:00:00 AM   6       1               12      2               2018        6-12-2018               NULL
NULL                6/12/2018 12:00:00 AM   6       1               12      2               2018        6-12-2018               NULL
NULL                6/12/2018 12:00:00 AM   6       1               12      2               2018        6-12-2018               NULL
NULL                6/12/2018 12:00:00 AM   6       1               12      2               2018        6-12-2018               NULL
10/12/2018 14:45    10/16/2018 12:00:00 AM  10      2               16      2               2018        10-16-2018              10-12-2018

下面列出了 [ActivateDate] 和 [ShipDate] 两列数据类型;但是,每次我尝试将 convert() 或 cast() 用于日期类型时,都会发生转换错误。

SELECT
    [ActivateDate], -- '10/12/2018 14:45' nvarchar(100)
    [ShipDate], -- '6/12/2018 12:00:00 AM'   nvarchar(100)
    SUBSTRING(iedimpr.[ShipDate],CHARINDEX('/', iedimpr.[ShipDate])-2,2) as 'Month',
    LEN(SUBSTRING(iedimpr.[ShipDate],CHARINDEX('/', iedimpr.[ShipDate])-2,2)) as 'Month_Length',
    REPLACE(SUBSTRING(iedimpr.[ShipDate],CHARINDEX('/', iedimpr.[ShipDate])+1,2),'/','') as 'Day-2c',
    LEN(REPLACE(SUBSTRING(iedimpr.[ShipDate],CHARINDEX('/', iedimpr.[ShipDate])+1,2),'/','')) as 'Day-2c_Length',
    SUBSTRING(iedimpr.[ShipDate],CHARINDEX('/201', iedimpr.[ShipDate])+1,4) as 'YEAR-201x',
    SUBSTRING(iedimpr.[ShipDate],CHARINDEX('/', iedimpr.[ShipDate])-2,2)
+'-'+REPLACE(SUBSTRING(iedimpr.[ShipDate],CHARINDEX('/', iedimpr.[ShipDate])+1,2),'/','') 
+'-'+SUBSTRING(iedimpr.[ShipDate],CHARINDEX('/201', iedimpr.[ShipDate])+1,4) as 'SHIPDateConcatenate',
    SUBSTRING(iedimpr.[ActivateDate],CHARINDEX('/', iedimpr.[ActivateDate])-2,2)
+'-'+REPLACE(SUBSTRING(iedimpr.[ActivateDate],CHARINDEX('/', iedimpr.[ActivateDate])+1,2),'/','') 
+'-'+SUBSTRING(iedimpr.[ActivateDate],CHARINDEX('/201', iedimpr.[ActivateDate])+1,4) as 'ActivateDateConcatenate'

【问题讨论】:

  • 6/12/2018 - 是 12 月 6 日还是 6 月 12 日? 6-12-2018 同样的问题。另外,为什么要将日期存储为字符串?将日期存储为日期,将日期 + 时间存储为 datetime2。
  • 早上好,这就是我的观点。原始数据是 nvarchar(100) 并希望将其转换为日期。我最初尝试了 convert(date,[shipdate]) 和 convert(nvarchar(10),[shipdate],102) 但似乎都不起作用。在中间阶段,我尝试至少将数字分开作为转换为日期的解决方法。

标签: sql string date sql-server-2016


【解决方案1】:

再次阅读问题后,我注意到示例数据格式错误,因此我对其进行了编辑。在此编辑过程中,我发现您使用美国风格 (mm/dd/yyyy) 来表示日期的字符串。

要将具有此格式的 DateTime 的有效字符串表示形式转换为日期,您需要在 convert 方法中使用 101 作为 style 参数。
但是,我强烈建议使用Try_convert 而不是Convert,因为它只会在值无法转换而不是引发错误时返回null。

话虽如此,这里是一个例子:

首先,创建并填充示例数据(请在您以后的问题中保存我们这一步):

DECLARE @T AS TABLE
(
    ActivateDate nvarchar(100),
    ShipDate nvarchar(100)
)

INSERT INTO @T(ActivateDate, ShipDate) VALUES
(NULL,                  '6/12/2018 12:00:00 AM'),
('10/12/2018 14:45',    '10/16/2018 12:00:00 AM'),
('20/14/2018 14:45',    '10/16/2018 12:00:00 AM'), -- invalid ActivateDate
('2/4/2018 14:45',      '10/16/ZOIB 12:00:00 AM') -- invalid ShipDate

查询:

SELECT  ActivateDate, 
        ShipDate,
        TRY_CONVERT(datetime, ActivateDate, 101) As DateActiveDate,
        TRY_CONVERT(datetime, ShipDate, 101) As DateShipDate
FROM @T

结果:

ActivateDate        ShipDate                    DateActiveDate          DateShipDate
NULL                6/12/2018 12:00:00 AM       NULL                    12.06.2018 00:00:00
10/12/2018 14:45    10/16/2018 12:00:00 AM      12.10.2018 14:45:00     16.10.2018 00:00:00
20/14/2018 14:45    10/16/2018 12:00:00 AM      NULL                    16.10.2018 00:00:00
2/4/2018 14:45      10/16/ZOIB 12:00:00 AM      04.02.2018 14:45:00     NULL

如果您只需要Date(没有时间部分),只需使用try_convert(date, ...) 而不是try_convert(datetime, ...)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-26
    相关资源
    最近更新 更多