我之前就如何将07-DEC-18 01.00.54.984000 PM
转换为2018-12-07 13.00.54.984000
提出了一个问题,并在以下链接中得到了一个很好的答案:Cast or convert DD-MON-YYYY AM/PM to YYYY-MM-DD
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)
);
该问题现已“关闭/批准”,因此我将提出一个新问题。
我想将此2018-12-07 13.00.54.984000
改成07-DEC-18 01.00.54.984000 PM
。与我的第一个问题相反。
答案 0 :(得分:2)
首先-我能为您提供的最佳建议是停止使用DateTime值的字符串表示形式。
在只有一个地方可以使用dateTime的字符串表示形式,并且在表示层上就是使用数据的UI。
话虽如此,有时无法更改系统的实现,而您只能使用现有的东西-这是一个如何将包含2018-12-07 13.00.54.984000
的字符串转换为包含{的字符串的代码示例{1}}。
因此,显然,第一步显然是将源字符串转换为07-DEC-18 01.00.54.984000 PM
-但为此,您需要将小时分钟和秒之间的点替换为冒号。
您可以使用DateTime2
来做到这一点。
STUFF
现在,要从DECLARE @DateString varchar(30) = '2018-12-07 13.00.54.984000'
SELECT CAST(STUFF(STUFF(@DateString, 17, 1, ':'), 14, 1, ':') AS DateTime2);
获得所需的字符串格式,最简单的方法是使用DateTime2
函数(尽管值得一提的是,与其他转换选项相比,它的性能相当慢-请参阅Aaron Bertrand的{{3 }})
Format
整个脚本:
SELECT FORMAT(@DateTime, 'dd-MMM-yy hh.mm.ss.fffffff tt')
结果
DECLARE @DateString varchar(30), @Date DateTime2;
SET @DateString = '2018-12-07 13.00.54.984000'
SELECT @Date = CAST(STUFF(STUFF(@DateString, 17, 1, ':'), 14, 1, ':') AS DateTime2)
SELECT FORMAT(@Date, 'dd-MMM-yy hh.mm.ss.fffffff tt') As Result
答案 1 :(得分:2)
编写了以下查询后使用不同的日期时间功能和日期样式
DECLARE @TIME DATETIME='2018-12-13 09:58:00.513'
SELECT concat(day(@TIME) ,'-',LEFT(datename(month,@TIME),3), '-',
year(@TIME),' ' ,cast(@TIME as time) ,' ',RIGHT(CONVERT(varchar(15),cast(@TIME as time),100),2))
输出
13-Dec-2018 09:58:00.5133333 AM
答案 2 :(得分:1)
--to convert to ISO, first preserve the final '.' char by
--converting to a placeholder 'q', with the intention
--of switcing back to '.' at a later stage
--then remove the '-' characters to give ISO date format
--YYYYMMDD
--then change the remaining '.' chars to ':'
--then we switch q back to '.'
--then cast to a datetime2 format
-- from the datetime2 format, the FORMAT
--command is applied with a mask of
--'dd-MMM-yy hh.mm.ss.FFFFFF tt'
--a final stage of convering to upper case
-- is then applied
SELECT UPPER(
FORMAT(
CAST(
REPLACE(
REPLACE(
REPLACE
(
STUFF(@dat, LEN(@DAT) + 1 - CHARINDEX('.', REVERSE(@DAT)),1,'q'),
'.',
':'
)
,'-',
''
)
,'q',
'.'
)
as datetime2
),
'dd-MMM-yy hh.mm.ss.FFFFFF tt'
)
);