如何转换mm / dd / yyyy militarytime - > mm / dd / yyyy hh:mm:ss AM / PM

时间:2017-06-02 13:59:00

标签: sql-server tsql datetime type-conversion sql-convert

我正在使用以下代码,而 几乎 正在寻找我正在寻找的内容:

 SELECT sdb.NAME AS DatabaseName
    ,COALESCE(CONVERT(VARCHAR(10), cast(max(bus.backup_finish_date) as date), 101) + ' ' + convert(varchar(12), max(bus.backup_finish_date), 108), 'Never Restored') as [LastBackupTime]
FROM sys.sysdatabases sdb
INNER JOIN dbo.backupset bus
    ON bus.database_name = sdb.NAME
GROUP BY sdb.NAME,
    bus.backup_finish_date

您的结果应该是这样的: mm / dd / yyyy HH:mm:ss

我想要得到 mm / dd / yyyy hh:mm:ss AM / PM

我尝试了多个转换,一系列演员,ltrim / right,甚至向T-SQL领主致敬。还没有运气。
我甚至试过

SELECT sdb.NAME AS DatabaseName
    --Code below needs changed to show Date & time--
    ,COALESCE(CONVERT(VARCHAR(30), MAX(bus.backup_finish_date), 100), 'Never 
backed up.') AS LastBackUpTime
FROM sys.sysdatabases sdb
INNER JOIN dbo.backupset bus
    ON bus.database_name = sdb.NAME
GROUP BY sdb.NAME,
    bus.backup_finish_date

但这让我(例如)2017年3月21日上午10:47。我们真的更喜欢3/21/2017 10:47 AM。

连连呢?我仍然选择这一点,但可以使用一些帮助。

谢谢!

3 个答案:

答案 0 :(得分:2)

如果您使用的是Select Format(Max(bus.backup_finish_date), N'MM/dd/yyyy hh:mm:ss tt') 或更高版本,则可以使用FORMAT()

{{1}}

答案 1 :(得分:1)

最简单的方法是使用格式,但效率不高:

select FORMAT(Max(bus.backup_finish_date),'MM/dd/yyyy hh:mm:ss tt')

对于早期版本,另一种天真的做法如下:

Select CONVERT(VARCHAR(10), getdate(), 101) + ' ' + LTRIM(RIGHT(CONVERT(CHAR(20), getdate(), 22), 11))

而不是GetDate()使用你的日期

但@GarethD已经提到了这一点,所以没关系

答案 2 :(得分:1)

如果您使用的是SQL Server 2012或更高版本,则可以FORMAT使用SELECT FORMAT(GETDATE(), 'MM/dd/yyyy hh:mm:sstt')

SELECT  CONVERT(VARCHAR(10), GETDATE(), 101) + ' '
            + CONVERT(VARCHAR(10), GETDATE(), 8)
            + CASE WHEN DATEPART(HOUR, GETDATE()) < 12 THEN 'AM' ELSE 'PM' END

对于早期版本,或者性能是一个问题,对于早期版本,或者性能是一个问题,您可以以MM / dd / yyyy(样式101)格式连接日期,格式为hh的时间:mm:ss(样式8)和用于确定AM或PM的案例表达式

15/01/2017

HOWEVER ,格式化是表示层的作业。如果是我这样做,那么我只需将原生日期时间(包括空值)发送回表示层并让它处理它。这意味着在您的应用程序层中,您仍然可以使用日期,执行日期计算或排序等,而无需担心02/02/2017将出现在Call_bitcoin()之后。这也意味着您可以在最终用户的首选区域设置中显示日期,而不是您的。