Sql server 将DD-MON-YYYY AM/PM转换为YYYY-MM-DD

Sql server 将DD-MON-YYYY AM/PM转换为YYYY-MM-DD,sql-server,tsql,date,casting,type-conversion,Sql Server,Tsql,Date,Casting,Type Conversion,我一直在寻找如何转换的答案: 07-DEC-18 01.00.54.984000 PM2018-12-07 13.00.54.984000 我想下午1点00分54分的时间是13小时0分54秒 我试着用112转换,但仍然找不到如何转换这个 这会将您的值转换为它应该是的数据类型,即datetime2(6)。日期和时间数据类型没有格式,如果以特定格式存储它们,则是错误的(因为这意味着将值存储为varchar) 如果这是一个表,那么我将通过执行以下操作修复您的实际列数据类型: UPDATE YT SET

我一直在寻找如何转换的答案:
07-DEC-18 01.00.54.984000 PM
2018-12-07 13.00.54.984000

我想下午1点00分54分的时间是13小时0分54秒


我试着用112转换,但仍然找不到如何转换这个

这会将您的值转换为它应该是的数据类型,即
datetime2(6)
。日期和时间数据类型没有格式,如果以特定格式存储它们,则是错误的(因为这意味着将值存储为
varchar

如果这是一个表,那么我将通过执行以下操作修复您的实际列数据类型:

UPDATE YT
SET YourDateColumn = CONVERT(varchar(30),TRY_CONVERT(datetime2(6),F.FormatedYD,106),126)
FROM YourTable YT
     CROSS APPLY (VALUES(STUFF(STUFF(YT.YourDateColumn,13,1,':'),16,1,':'))) F(FormatedYD);

ALTER TABLE YourTable ALTER COLUMN YourDateColumn datetime2(6);

下面是一种分别转换日期和时间部分的方法,然后使用
DATEADD
组合结果。这假定实际时间精度不大于毫秒。请注意,您需要使用
datetime2
而不是
datetime
,以避免四舍五入到1/300毫秒

DECLARE @DateTimeString varchar(30) = '07-DEC-18 01.00.54.984000 PM';
SELECT DATEADD(
      millisecond
    , DATEDIFF(millisecond, '', CAST(REPLACE(SUBSTRING(@DateTimeString, 11, 8), '.', ':') + RIGHT(@DateTimeString, 10) AS time))
    , CAST(LEFT(@DateTimeString, 9) AS datetime2)
    );

它存储在什么数据类型中?这是谜题的一个基本部分。你为什么要这样格式化它\
DECLARE @DateTimeString varchar(30) = '07-DEC-18 01.00.54.984000 PM';
SELECT DATEADD(
      millisecond
    , DATEDIFF(millisecond, '', CAST(REPLACE(SUBSTRING(@DateTimeString, 11, 8), '.', ':') + RIGHT(@DateTimeString, 10) AS time))
    , CAST(LEFT(@DateTimeString, 9) AS datetime2)
    );