Sql server 标准化SQL查询中的显示日期时间

Sql server 标准化SQL查询中的显示日期时间,sql-server,datetime-format,Sql Server,Datetime Format,当我在SQL Server中查询时,我发现datetime以不同的格式显示在下面的列中 a.BATCHREG_TM1, a.BATCHREG_TM2, a.BATCHREG_TM3, a.BATCHREG_TM4, a.BATCHREG_TM5, a.BATCHREG_TM6, a.BATCHREG_TM7, a.BATCHREG_TM8, a.BATCHREG_TM9, a.BATCHREG_TM10, a.REG_TM, a.REWORK_TM, 要求: 以DD/MM/YYYY HH:MM

当我在SQL Server中查询时,我发现
datetime
以不同的格式显示在下面的列中

a.BATCHREG_TM1, a.BATCHREG_TM2, a.BATCHREG_TM3, a.BATCHREG_TM4, a.BATCHREG_TM5,
a.BATCHREG_TM6, a.BATCHREG_TM7, a.BATCHREG_TM8, a.BATCHREG_TM9, a.BATCHREG_TM10,
a.REG_TM, a.REWORK_TM,
要求:

  • 以DD/MM/YYYY HH:MM:SS一种格式显示
  • 以替代名称显示列的燃料值和发动机值等
  • 示例:如果燃油中的“U”,则显示为柴油,如果“G”显示为汽油

    SELECT 
        a.DEVICE_ID, a.MES_SEQ, a.BODY_NO, a.STN_NM,
        c.LINE_CD, a.[SHIFT], a.REG_TM, a.REWORK_TM, a.FIRST_STATUS,
        CAST(TOR_VALUE1 AS float) / 100 AS TOR_VALUE1,
        CAST(TOR_VALUE2 AS float) / 100 AS TOR_VALUE2,
        CAST(TOR_VALUE3 AS float) / 100 AS TOR_VALUE3,
        CAST(TOR_VALUE4 AS float) / 100 AS TOR_VALUE4,
        CAST(TOR_VALUE5 AS float) / 100 AS TOR_VALUE5,
        CAST(TOR_VALUE6 AS float) / 100 AS TOR_VALUE6,
        CAST(TOR_VALUE7 AS float) / 100 AS TOR_VALUE7,
        CAST(TOR_VALUE8 AS float) / 100 AS TOR_VALUE8,
        CAST(TOR_VALUE9 AS float) / 100 AS TOR_VALUE9,
        CAST(TOR_VALUE10 AS float) / 100 AS TOR_VALUE10,
        CONVERT(INT, ANG_VALUE1) AS ANG_VALUE1,
        CONVERT(INT, ANG_VALUE2) AS ANG_VALUE2,
        CONVERT(INT, ANG_VALUE3) AS ANG_VALUE3,
        CONVERT(INT, ANG_VALUE4) AS ANG_VALUE4,
        CONVERT(INT, ANG_VALUE5) AS ANG_VALUE5,
        CONVERT(INT, ANG_VALUE6) AS ANG_VALUE6,
        CONVERT(INT, ANG_VALUE7) AS ANG_VALUE7,
        CONVERT(INT, ANG_VALUE8) AS ANG_VALUE8,
        CONVERT(INT, ANG_VALUE9) AS ANG_VALUE9,
        CONVERT(INT, ANG_VALUE10) AS ANG_VALUE10,
        a.BATCHREG_TM1,a.BATCHREG_TM2,a.BATCHREG_TM3,a.BATCHREG_TM4,a.BATCHREG_TM5,
        a.BATCHREG_TM6,a.BATCHREG_TM7,a.BATCHREG_TM8,a.BATCHREG_TM9,a.BATCHREG_TM10,
        a.BATCH_STATUS,a.TOTAL_STATUS,
        a.REWORK_STATUS,a.REWORK_JOBFLAG,a.PLANT,a.SCAN_CHK,a.TOT_BATCH_NUM,
        a.VIEWFLAG,a.TOOLSNETCHK,a.JOB_NUM,a.REWORKJOB_NUM,c.LH_RH,
        c.DEVICE_STATUS, c.USE_219_CHK
        [MODEL], [DRIVE],[BODY],[TRANSMISSION],[FUEL],[ENGINE],[BRAKESYSTEM],[AIRCON],[REGION]
    FROM 
        [C].[dbo].[NUT] a
    LEFT JOIN 
        [C].[dbo].[IF_ORDER] b ON a.body_no = b.body_no
    LEFT JOIN 
        [C.[dbo].[REG] c ON a.device_id = c.device_id
    OUTER APPLY 
        (VALUES (
           SUBSTRING(b.[spec219], 2, 1),
           SUBSTRING(b.[spec219], 3, 1),
           SUBSTRING(b.[spec219], 4, 1),
           SUBSTRING(b.[spec219], 7, 1),
           SUBSTRING(b.[spec219], 8, 1),
           SUBSTRING(b.[spec219], 9, 1),
           SUBSTRING(b.[spec219], 13, 1),
           SUBSTRING(b.[spec219], 28, 1),
        SUBSTRING(b.[spec219], 218, 1)
    )) v ([MODEL], [DRIVE],[BODY],[TRANSMISSION],[FUEL],[ENGINE],[BRAKESYSTEM],[AIRCON],[REGION])
    WHERE 
        a.reg_tm >= '20200320000000' AND a.reg_tm <= '20200320015959'
    ORDER BY 
        a.reg_tm
    

    就像我提到的,你需要在这里修改你的设计;这是唯一的解决方案

    在您给出的示例中有两种格式,
    yyyyMMddhhmmss
    yyyy-MM-dd:hh:MM:ss
    ,因此我将为这两种格式提供解决方案。如果你有更多,那么你也必须解决这些问题

    首先,我们需要将值更新为
    ISO
    格式。我将使用
    yyyy-MM-ddThh:MM:ss

    UPDATE dbo.YourTable
    SET YourDate = STUFF(STUFF(STUFF(STUFF(STUFF(V.YourDate,13,0,':'),11,0,':'),9,0,'T'),7,0,'-'),5,0,'-')
    WHERE YourDate LIKE '[0-2][0-9][0-9][0-9][0-1][0-9][0-3][0-9][0-2][0-9][0-5][0-9][0-5][0-9]';
    
    
    UPDATE dbo.YourTable
    SET YourDate = STUFF(V.YourDate,11,1,'T')
    WHERE YourDate LIKE '[0-2][0-9][0-9][0-9]-[0-1][0-9]-[0-3][0-9]:[0-2][0-9]:[0-5][0-9]:[0-5][0-9]';
    
    现在这两种不同的格式是ISO格式。我建议您也通过以下查询检查任何其他无效值:

    SELECT YourDate
    FROM dbo.YourTable
    WHERE TRY_CONVERT(date,YourDate,126) IS NULL
      AND YourDate IS NOT NULL;
    
    在上述查询未返回任何行(因为您已修复了所有错误值)之后,您可以修复该列:

    ALTER TABLE dbo.YourTable ALTER COLUMN YourDate datetime2(0);
    

    现在,您的列实际上是一个日期和时间列,它将提供一个日期和时间值。

    就像我提到的,您需要在这里修复您的设计;这是唯一的解决方案

    在您给出的示例中有两种格式,
    yyyyMMddhhmmss
    yyyy-MM-dd:hh:MM:ss
    ,因此我将为这两种格式提供解决方案。如果你有更多,那么你也必须解决这些问题

    首先,我们需要将值更新为
    ISO
    格式。我将使用
    yyyy-MM-ddThh:MM:ss

    UPDATE dbo.YourTable
    SET YourDate = STUFF(STUFF(STUFF(STUFF(STUFF(V.YourDate,13,0,':'),11,0,':'),9,0,'T'),7,0,'-'),5,0,'-')
    WHERE YourDate LIKE '[0-2][0-9][0-9][0-9][0-1][0-9][0-3][0-9][0-2][0-9][0-5][0-9][0-5][0-9]';
    
    
    UPDATE dbo.YourTable
    SET YourDate = STUFF(V.YourDate,11,1,'T')
    WHERE YourDate LIKE '[0-2][0-9][0-9][0-9]-[0-1][0-9]-[0-3][0-9]:[0-2][0-9]:[0-5][0-9]:[0-5][0-9]';
    
    现在这两种不同的格式是ISO格式。我建议您也通过以下查询检查任何其他无效值:

    SELECT YourDate
    FROM dbo.YourTable
    WHERE TRY_CONVERT(date,YourDate,126) IS NULL
      AND YourDate IS NOT NULL;
    
    在上述查询未返回任何行(因为您已修复了所有错误值)之后,您可以修复该列:

    ALTER TABLE dbo.YourTable ALTER COLUMN YourDate datetime2(0);
    

    现在,您的列实际上是一个日期和时间列,它将提供日期和时间值。

    日期和时间数据类型没有格式。某些行显示的值类似于
    20200319235441
    ,而另一些行显示的值类似于
    2020-03-20:00:00:03
    ,这意味着该列不是日期和时间数据类型,而是
    (n)varchar
    。这就是问题所在,您的数据类型是错误的。不幸的是,您在这里唯一的选择是花时间将数据固定为ISO格式(我建议
    yyy-MM-ddThh:MM:ss.nnnnnnn
    ),然后将列的定义更改为日期和时间数据类型(使用
    ALTER-TABLE
    )。旁注:谢谢!是,列为字符(14)格式。我不想打扰你修改桌子。我只需要查询和导出数据@LamuDate和time数据类型没有格式。某些行显示的值类似于
    20200319235441
    ,而另一些行显示的值类似于
    2020-03-20:00:00:03
    ,这意味着该列不是日期和时间数据类型,而是
    (n)varchar
    。这就是问题所在,您的数据类型是错误的。不幸的是,您在这里唯一的选择是花时间将数据固定为ISO格式(我建议
    yyy-MM-ddThh:MM:ss.nnnnnnn
    ),然后将列的定义更改为日期和时间数据类型(使用
    ALTER-TABLE
    )。旁注:谢谢!是,列为字符(14)格式。我不想打扰你修改桌子。我只需要查询和导出数据@拉木