将前导空格添加到单个数字日期部分的简单方法(日,...)

时间:2016-07-27 15:13:26

标签: tsql

使用SQL Server 2014,我正在开发一种提供日期范围列表的方法。当我得到正确的日期范围时,我留下了一个整容任务:为一位数字日值添加一个前导空格。

Date range without leading space

这是产生屏幕截图中显示的值的代码。

DECLARE @int INT = 6;
/* to add 6 days to start of date range*/

SELECT DateRange = CONCAT (
        left(DATENAME(MONTH, d.DATE), 3),
        ' ',
        datepart(day, d.DATE),
        ' — ',
        datepart(day, DATEADD(day, @int, d.DATE))
        )
FROM dbo.CalendarFundingDays d
WHERE d.SchoolYear = '16-17'
    AND datepart(WEEKDAY, d.DATE) = 2

为了产生单位数日值的领先空间,我可以抛出一些案例逻辑,但它看起来很难看。

DECLARE @int INT = 6;
/* to add 6 days to start of date range*/

SELECT DateRange = CONCAT (
        left(DATENAME(MONTH, d.DATE), 3),
        ' ',
        CASE 
            WHEN len(cast(datepart(day, d.DATE) AS NVARCHAR(2))) = 1
                THEN CONCAT (
                        ' ',
                        cast(datepart(day, d.DATE) AS NVARCHAR(2))
                        )
            ELSE cast(datepart(day, d.DATE) AS NVARCHAR(2))
            END,
        ' — ',
        left(DATENAME(MONTH, DATEADD(day, @int, d.DATE)), 3),
        ' ',
        CASE 
            WHEN len(cast(datepart(day, DATEADD(day, @int, d.DATE)) AS NVARCHAR(2))) = 1
                THEN CONCAT (
                        ' ',
                        cast(datepart(day, DATEADD(day, @int, d.DATE)) AS NVARCHAR(2))
                        )
            ELSE cast(datepart(day, DATEADD(day, @int, d.DATE)) AS NVARCHAR(2))
            END
        )
FROM dbo.CalendarFundingDays d
WHERE datepart(WEEKDAY, d.DATE) = 2;

虽然结果是我需要的,但代码很丑陋且难以阅读。是否有更简单的方法来产生相同的结果?

This is the desired format

2 个答案:

答案 0 :(得分:2)

这是SQL Server 2014所以你真的可以利用format()功能。这使您可以轻松地进行调整,并消除了大量日期部分的混乱。 case处理开始和结束月份不同的范围(假设您不想重复月份部分:)

replace(
    concat(
        format(@d1, 'MMM dd'),
        ' - ',
        format(@d2,
            case when datediff(month, @d1, @d2) <> 0
                 then 'MMM dd' else 'dd' end
        )
    ), ' 0', '  ');

通常,<space>0模式并不总是可靠的,但您可以使用格式中的特殊标记来保存替换位置:

replace(replace(
    concat(
        format(@d1, 'MMM ^dd'),
        ' - ',
        format(@d2,
            case when datediff(month, @d1, @d2) <> 0
                 then 'MMM ' else '' end + '^dd'
        )
    ), '^0', ' '), '^', '');

答案 1 :(得分:1)

SELECT DateRange = CONCAT (
        left(DATENAME(MONTH, d.DATE), 3),
        ' ',
        RIGHT(' ' + CAST(datepart(day, d.DATE) AS NVARCHAR(2)),2),
        ' — ',
        RIGHT(' ' + CAST(datepart(day, DATEADD(day, @int, d.DATE)) AS NVARCHAR(2)),2)
    )
FROM dbo.CalendarFundingDays d
WHERE d.SchoolYear = '16-17'
AND datepart(WEEKDAY, d.DATE) = 2