首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在SQL中将字符串值转换为日期时间

在SQL中将字符串值转换为日期时间
EN

Stack Overflow用户
提问于 2018-10-17 14:40:57
回答 2查看 43关注 0票数 1

我的查询有问题

代码语言:javascript
复制
USE [db]
GO

SELECT 
    TD.ID, LOM.ScanDate, RD.ProcessorType, RD.ProcessorResult, RD.Score  
FROM 
    [dbo].[LogicalObject_Metadatas] LOM WITH(NOLOCK)
JOIN 
    [dbo].[LogicalObject] LO WITH(NOLOCK) ON LO.ID = LOM.OBJECTID
JOIN 
    [db2].[dbo].[JobData] JD With(NOLOCK) ON LO.DOCUMENTID = JD.DocumentID
JOIN 
    [db2].[dbo].[TaskData] TD WITH(NOLOCK) ON JD.ID = TD.ParentID
JOIN 
    [db2].[dbo].[RecognitionData] RD WITH(NOLOCK) ON TD.ID = RD.ID
WHERE
    LOM.[Source] = 'MANUFAST_AVR_DNN_QA'
    AND LOM.[ScanDate] > '2018-10-01'
    AND LOM.[ScanDate] < '2018-10-16'
    AND RD.[ProcessorType] IN ('F05AM', 'F06', 'F08', 'F09', 'F11', 'F12A')

如果[ProcessorResult]= F05AM,我希望将其转换为datetime;如果不是,则按其方式进行转换。

我试过使用IF,cast,但没有结果。

这就是查询的方式:

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-10-17 15:02:10

您可以在您的case子句中使用select语句来实现这一点,同时还可以使用一些stuff调用来处理DDMMYY的输入格式(如果您愿意,可以将120样式替换为任何其他样式):

代码语言:javascript
复制
select 
    TD.ID,
    LOM.ScanDate,
    RD.ProcessorType,
    case 
        when RD.ProcessorType = 'F05AM' and ISDATE(RD.ProcessorResult) = 1
        then convert(varchar,convert(datetime,stuff(stuff(RD.ProcessorResult,5,0,'.'),3,0,'.'), 4),120)  
        else RD.ProcessorResult 
    end as ProcessorResult,
    RD.Score  
from [dbo].[LogicalObject_Metadatas] LOM with (nolock)
join [dbo].[LogicalObject] LO with(nolock) on LO.ID = LOM.OBJECTID
join [db2].[dbo].[JobData] JD with(nolock) on LO.DOCUMENTID = JD.DocumentID
join [db2].[dbo].[TaskData] TD with(nolock) on JD.ID = TD.ParentID
join [db2].[dbo].[RecognitionData] RD with(nolock) on TD.ID = RD.ID
where LOM.[Source] = 'MANUFAST_AVR_DNN_QA'
and LOM.[ScanDate] > '2018-10-01'
and LOM.[ScanDate] < '2018-10-16'
and RD.[ProcessorType] IN ('F05AM','F06','F08','F09','F11','F12A')

但是,在同一列中混合数据类型可能是不可取的,因为在这些数据中混合了非日期值时,您将无法以聚合或分析的方式对这些日期做任何用途。

票数 0
EN

Stack Overflow用户

发布于 2018-10-17 15:02:11

最重要的一点是,您不能有一个列有时是日期/时间,有时不是。列有固定的类型。

您可以通过某些字符串操作将字符串转换为日期。这将创建一个日期列:

代码语言:javascript
复制
select (case when ProcessorType = 'F05AM'
             then convert(date, '20' + right(ProcessorResult, 2) + substring(ProcessorResult, 3, 2) + left(ProcessorResult, 2))
        end)

你只想要一个看起来像约会的字符串,所以我会这样做:

代码语言:javascript
复制
select (case when ProcessorType = 'F05AM'
             then '20' + right(ProcessorResult, 2) + substring(ProcessorResult, 3, 2) + left(ProcessorResult, 2)
             else ProcessorResult
        end)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52857553

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档