0

我正在使用以下代码,几乎得到了我正在寻找的东西:

 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 分。我们真的更喜欢 2017 年 3 月 21 日上午 10:47。

建议?我仍在挑选这个,但可以使用一些帮助。

谢谢!

4

3 回答 3

2

如果您正在使用SQL Server 2012或更高版本,您可以使用FORMAT()

Select Format(Max(bus.backup_finish_date), N'MM/dd/yyyy hh:mm:ss tt')
于 2017-06-02T14:12:43.547 回答
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提到了所以没关系

于 2017-06-02T14:13:20.667 回答
1

如果您使用的是 SQL Server 2012 或更高版本,则可以使用FORMAT,但要小心在大型数据集上执行此操作

SELECT FORMAT(GETDATE(), 'MM/dd/yyyy hh:mm:sstt')

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

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

但是,格式化是表示层的工作。如果是我这样做,那么我只需将本机日期时间(包括空值)发送回表示层并让它处理它。这意味着在您的应用程序层中,您仍然可以处理日期、执行日期计算或排序等,而不必15/01/2017担心02/02/2017. 这也意味着您可以在最终用户的首选语言环境中显示日期,而不是您的。

于 2017-06-02T14:19:45.537 回答