提问人:Colin-G-Davidson 提问时间:10/4/2023 最后编辑:Colin-G-Davidson 更新时间:10/5/2023 访问量:73
将 ISO 格式的字符串日期时间转换为 ANSI
Convert from string datetime in ISO format to ANSI
问:
我有一个 varchar 列,它以以下格式提供日期时间
yyyymmddhhmmss
为了将其存储在 datetime2 列中,我需要将其转换为 ANSI 格式
yyyy-mm-dd hh:mm:ss
我使用了一个转换函数来处理以英国格式格式格式的类似列,例如 04/10/2023 11:15:00 可以使用 CONVERT(datetime2(0),COLUMN,103) 解决。
问题是我在尝试这样做时遇到错误
SELECT TOP (5)
[HistoryID]
,[CheckedBy]
,[CheckedTime]
,CheckedTime2 = SUBSTRING(CheckedTime,1,4) + '-' + SUBSTRING(CheckedTime,5,2) + '-' + SUBSTRING(CheckedTime,7,2) + ' ' + SUBSTRING(CheckedTime,9,2) + ':' + SUBSTRING(CheckedTime,11,2) + ':' + SUBSTRING(CheckedTime,13,2)
--,CONVERT(datetime2(0),CheckedTime,112)
,CONVERT(datetime2(0),
SUBSTRING(CheckedTime,1,4) + '-' + SUBSTRING(CheckedTime,5,2) + '-' + SUBSTRING(CheckedTime,7,2) + ' ' + SUBSTRING(CheckedTime,9,2) + ':' + SUBSTRING(CheckedTime,11,2) + ':' + SUBSTRING(CheckedTime,13,2)
,120) AS [CheckedTime3]
,[RevokedBy]
,[RevokedTime]
,[AnalystRef]
FROM [staging].[AccuracyChecks]
上面生成以下内容
历史 ID | 检查者 | CheckedTime(检查时间) | 检查时间2 | 检查时间3 |
---|---|---|---|---|
63061C5F-0062-02056B95 | 1 | 20220825082057 | 2022-08-25 08:20:57 | 2022-08-25 08:20:57 |
63061C5F-0062-02056B96 | 1 | 20220825082057 | 2022-08-25 08:20:57 | 2022-08-25 08:20:57 |
63061CBC-0062-02056B97 | 1 | 20220825082053 | 2022-08-25 08:20:53 | 2022-08-25 08:20:53 |
63061CBC-0062-02056B98 | 1 | 20220825082053 | 2022-08-25 08:20:53 | 2022-08-25 08:20:53 |
63061E55-0062-02056B99 | 1 | 20220825082026 | 2022-08-25 08:20:26 | 2022-08-25 08:20:26 |
正如你所看到的,当我使用substring方法或使用substring方法转换时,它会正确生成它。
注释掉的行
CONVERT(datetime2(0),CheckedTime,112)
产生以下错误
从字符串转换日期和/或时间时转换失败。
我在文档中看到的唯一区别是样式代码 112 不包括 TIME 数据。
转换为所需格式的正确方法是什么,因为使用 SUBSTRING 方法会导致与过滤器相关的不同错误,我之前曾通过 CONVERT 函数帮助解决该错误。
虽然我怀疑这很重要,但我无法控制接收数据的格式。
答:
0赞
Colin-G-Davidson
10/5/2023
#1
因此,在回答我最初的问题时,似乎没有办法以该格式样式(yyyymmddhhmmss)将CONVERT与它一起使用。
根据评论中的建议,我在暂存表中添加了一个新的 datetime2 列。使用这个新列,我更改了 SP 以使用原始 SUBSTRING 方法更新该列,仅适用于我当时正在处理的筛选记录。然后,我能够在 MERGE 语句中使用新创建的列,这避免了之前看到的操作顺序错误。
评论
yyyy-MM-ddTHH:mm:ss
MERGE
的忠实粉丝,但也许您可以使用 而不是 .但是很难想象我们如何从模糊的描述中帮助您解决问题 - 恕我直言,这应该是您的问题所关注的问题。因为无论您如何强制将存储为字符串的日期转换为日期,如果引擎在转换发生之前尝试访问该列,或者过滤器发生得太晚而无法过滤掉潜入此类列的垃圾,您仍然会卡住。TRY_CONVERT()
CONVERT()
SELECT expression FROM ... WHERE filter
expression
filter
CASE
CONVERT()