【问题标题】:convert a varchar(14) to a datetime cause a exception将 varchar(14) 转换为日期时间导致异常
【发布时间】:2020-01-07 08:34:39
【问题描述】:

我有一个数据库,里面有病人。患者有一个进入和退出日期,女巫是字符串。

例如:20130510183900 (10-05-2013 18:39) 首先是数据库中的那个,然后是我需要的值

我想将其转换为日期时间,以便与其他日期进行比较。

我也无法在视图中显示它已转换

我已经尝试过先将其转换为 varchar 或 int,但没有任何成功

convert(datetime, enterDate, 121) -- does not work
convert(datetime, enterDate, 121) AS enterDate -- does not work

我得到的错误是:

从字符转换日期和/或时间时转换失败 字符串。

【问题讨论】:

  • 您使用的是哪个 dbms? (在日期/时间方面,许多产品远不符合 ANSI SQL。)
  • ... so I can compare it with other dates ← 如果您只是“比较”(等于、大于、小于)其他值,则现有字符串值将按原样工作。如果您需要对它们进行任何计算(时间跨度差异或添加月份或仅比较部分日期时间),那么您需要进行转换。也就是说,在存储值时,您应该始终选择适当的数据类型。
  • 我正在使用 microsoft sql server 管理工作室
  • 请始终指定您使用的 SQL Server 版本(如果是

标签: sql sql-server datetime converters


【解决方案1】:

将日期时间值存储为字符串是错误的。话虽如此,你可以使用DATETIMEFROMPARTS函数:

SELECT DATETIMEFROMPARTS(
    SUBSTRING(enterDate,  1, 4),
    SUBSTRING(enterDate,  5, 2),
    SUBSTRING(enterDate,  7, 2),
    SUBSTRING(enterDate,  9, 2),
    SUBSTRING(enterDate, 11, 2),
    SUBSTRING(enterDate, 13, 2),
    0
)
FROM (SELECT '20130510183900') AS v(enterDate)

同样,将日期时间值存储为字符串是错误的。

【讨论】:

  • 首先感谢您的快速回复和编辑
  • 但现在我收到此错误“DATETIMEFROMPARTS”不是可识别的内置函数名称。
  • @Nötter 如果您使用的 SQL Server 版本不受支持且没有 DATETIMEFROMPARTS,那么 (a) 为什么不将其指定为问题的标签,以及 (b)你为什么接受这个答案?
  • @AaronBertrand 公平地说,即使在 2019 版本中也可能会出现该错误,因为 it still supports compatibility level of 100(尽管我同意这不太可能)...
  • @Zohar 降低兼容性级别不会删除内置标量函数;它在 100 兼容级别下工作得很好。它可以影响像STRING_SPLIT() 这样的表值函数,但对*FROMPARTS() 没有影响。
【解决方案2】:

另一种选择是使用stuffconvert 的组合:

DECLARE @DateString varchar(14) = 20130510183900 

SELECT CONVERT(DateTime,
                STUFF(
                    STUFF(
                        STUFF(
                            STUFF(
                                STUFF(@DateString, 13, 0, ':')
                            , 11, 0, ':')
                        , 9, 0, 'T')
                    , 7, 0, '-')
                , 5, 0, '-'),
               126)

stuff 函数将字符串转换为2013-05-10T18:39:00 并且 convert 样式为 126 将其更改为 DateTime 值。

但我同意 Salman - 将日期时间值存储为字符串是错误的。

【讨论】:

    【解决方案3】:

    试试这个:

    DECLARE @DateString varchar(14) = '20130510183900'
    
    -- desired format: '20130510 18:39:00'
    SET @DateString = STUFF(STUFF(STUFF(@DateString,13,0,':'),11,0,':'),9,0,' ')
    
    SELECT CONVERT(datetime, @DateString)
    -- Output: 2013-05-10 18:39:00.000
    

    您的问题是输入字符串,如果不调整字符串,sql 无法处理。顺便说一句:Convert() 的第三个参数用于将日期时间转换/格式化为字符串:

    SELECT CONVERT(VARCHAR, CONVERT(datetime, @DateString), 101)
    -- Output: 05/10/2013
    

    在选择中的用法:

    SELECT CONVERT(datetime, STUFF(STUFF(STUFF(<DateTimeStringColumn>,13,0,':'),11,0,':'),9,0,' ')) AS DateTimeValue
    FROM ...
    

    【讨论】:

    • 这可行,但我有超过 7000 个数据集,所以我应该使用子字符串吗?
    • @Nötter 你能定义一个“数据集”吗?您在一个 blob 列中有 7,000 个表、行、列、值,...?为什么你的约会一开始就采用这种糟糕的格式?你不能在它们进入数据库之前将它们转换成合理的格式吗?
    • @Nötter:这只是一个可运行的示例,您不需要在此处声明和设置。如果你想在选择中使用它,试试这个 SELECT CONVERT(datetime, STUFF(STUFF(STUFF(,13,0,':'),11,0,':'),9,0,' ')) 来自 ...
    • 和@AaronBertrand 写道:如果您可以在将其插入数据库之前对其进行转换,那将是更好的选择!!!
    猜你喜欢
    • 1970-01-01
    • 2014-06-07
    • 1970-01-01
    • 1970-01-01
    • 2019-12-23
    • 2019-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多