可以避免在QUERY中重复表达式

时间:2015-12-04 19:20:05

标签: sql sql-server tsql sql-server-2008-r2

我必须以奇怪的格式显示时间。 例如,如果时间是15:30:45.5000,我需要显示“153045.5”。

为此,我有以下查询:

SELECT  LEFT(CONVERT(varchar(20), GETDATE(), 114), 2) +     
   SUBSTRING(CONVERT(varchar(20), GETDATE(), 114), 4, 2) +   
   SUBSTRING(CONVERT(varchar(20), GETDATE(), 114), 7, 2) + '.' + 
   SUBSTRING(CONVERT(varchar(20), GETDATE(), 114), 10, 1);

我能做些什么来避免重复表达CONVERT(varchar(20),GETDATE(),114)?

编辑:

我在这里看到了一个非常酷的答案,在我刷新页面后因某些原因被删除了,但它让我想到了另一种解决方案:

SELECT REPLACE(RIGHT(CONVERT(varchar(21), getdate(), 126), 10), ':', '')

虽然这个答案并没有以一般方式解决原始问题,但它仍然以不同的方式解决了我的问题。

4 个答案:

答案 0 :(得分:5)

除了其他答案中的函数,您还可以在公用表表达式(CTE)或内联视图中计算部分结果:

; WITH gd(getDate_114)
     AS (SELECT CONVERT(VARCHAR(20), GETDATE(), 114))
SELECT LEFT(getDate_114, 2)
    + SUBSTRING(gd.getDate_114, 4, 2) 
    + SUBSTRING(gd.getDate_114, 7, 2)
    + '.'
    + SUBSTRING(gd.getDate_114, 10, 1)
FROM gd

答案 1 :(得分:2)

在函数中包装所有格式代码

create function dbo.FormatTime (@time datetime) 
returns varchar(20)
as
begin
    return (select LEFT(CONVERT(varchar(20), @time, 114), 2) 
            + SUBSTRING(CONVERT(varchar(20), @time, 114), 4, 2) 
            + SUBSTRING(CONVERT(varchar(20), @time, 114), 7, 4))
end

并将其用作

select dbo.FormatTime(getdate())

为避免在函数体中重复,您可以将@time转换为varchar存储在变量中

declare @dateAsVarchar varchar(20) = CONVERT(varchar(20), @time, 114)

return (select LEFT(@dateAsVarchar, 2) 
        + SUBSTRING(@dateAsVarchar, 4, 2) 
        + SUBSTRING(@dateAsVarchar, 7, 4))

答案 2 :(得分:2)

不幸的是,除非我弄错了,否则在SQL Server 2008 R2中没有办法将其最小化。您必须按照您已经完成的方式构建它。另一个选项(正如@jonasnas已经指出的那样)是创建一个返回当前日期格式的函数。

但是,如果您能够/愿意升级到SQL Server 2012,则可以利用FORMAT()函数格式化字符串:

Select Format(GetDate(), N'HHmmss.f')

答案 3 :(得分:1)

您可以在数据库中创建一个函数并使用它。这是示例How to create a function in SQL Server