将yyyy-mm-dd转换或转换为dd-mon-yyyy am / pm

时间:2018-12-13 09:48:37

标签: sql-server tsql date casting type-conversion

我之前就如何将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。与我的第一个问题相反。

3 个答案:

答案 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'
            )
            );