Sql server 标准化SQL查询中的显示日期时间
当我在SQL Server中查询时,我发现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
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,
要求:
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)格式。我不想打扰你修改桌子。我只需要查询和导出数据@拉木