我正在使用以下代码,而 几乎 正在寻找我正在寻找的内容:
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。
连连呢?我仍然选择这一点,但可以使用一些帮助。
谢谢!
答案 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()
之后。这也意味着您可以在最终用户的首选区域设置中显示日期,而不是您的。