Tsql 向一位数datepart(day,…)添加前导空格的简单方法

Tsql 向一位数datepart(day,…)添加前导空格的简单方法,tsql,Tsql,使用SQL Server 2014,我正在研究提供日期范围列表的方法。当我得到正确的日期范围时,我剩下一个装饰性的任务:为一位数的日值添加前导空格 这是生成屏幕截图中显示的值的代码 DECLARE @int INT = 6; /* to add 6 days to start of date range*/ SELECT DateRange = CONCAT ( left(DATENAME(MONTH, d.DATE), 3), ' ', da

使用SQL Server 2014,我正在研究提供日期范围列表的方法。当我得到正确的日期范围时,我剩下一个装饰性的任务:为一位数的日值添加前导空格

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

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
为了生成一位数日值的前导空格,我可以加入一些case逻辑,但它看起来非常难看

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;
虽然结果是我所需要的,但代码很难看,很难阅读。有没有更简单的方法来产生相同的结果


这是SQL Server 2014,因此您最好利用
format()
函数。这使您可以轻松地进行调整,并消除了许多混乱的日期部分剪断。
案例
处理开始月份和结束月份不相同时的范围(假设您不想重复月份部分:)

替换(
海螺(
格式(@d1,'MMM dd'),
' - ',
格式(@d2,
datediff(月份,@d1,@d2)0时的情况
然后是“嗯,dd”或者“dd”结束
)
), ' 0', '  ');
通常情况下,
0
模式并不总是可靠的,但您可以使用格式中的特殊标记保存位置,以便以后替换:

replace(replace(
    concat(
        format(@d1, 'MMM ^dd'),
        ' - ',
        format(@d2,
            case when datediff(month, @d1, @d2) <> 0
                 then 'MMM ' else '' end + '^dd'
        )
    ), '^0', ' '), '^', '');
replace(替换(
海螺(
格式(@d1,'MMM^dd'),
' - ',
格式(@d2,
datediff(月份,@d1,@d2)0时的情况
然后是'MMM'或'end+'^dd'
)
), '^0', ' '), '^', '');

这是SQL Server 2014,因此您最好利用
format()
函数。这使您可以轻松地进行调整,并消除了许多混乱的日期部分剪断。
案例
处理开始月份和结束月份不相同时的范围(假设您不想重复月份部分:)

替换(
海螺(
格式(@d1,'MMM dd'),
' - ',
格式(@d2,
datediff(月份,@d1,@d2)0时的情况
然后是“嗯,dd”或者“dd”结束
)
), ' 0', '  ');
通常情况下,
0
模式并不总是可靠的,但您可以使用格式中的特殊标记保存位置,以便以后替换:

replace(replace(
    concat(
        format(@d1, 'MMM ^dd'),
        ' - ',
        format(@d2,
            case when datediff(month, @d1, @d2) <> 0
                 then 'MMM ' else '' end + '^dd'
        )
    ), '^0', ' '), '^', '');
replace(替换(
海螺(
格式(@d1,'MMM^dd'),
' - ',
格式(@d2,
datediff(月份,@d1,@d2)0时的情况
然后是'MMM'或'end+'^dd'
)
), '^0', ' '), '^', '');

当一个范围跨越几个月时,您的格式非常奇怪。例如“9月26日-2日”您使用的是什么版本?我知道发生了什么。这应该是“9月26日-10月2日”。能否将范围的开始日、开始月、结束日和结束月作为单独的列返回,然后在应用程序的UI层中进行格式化?这一表有多种用途和多个目的地。我真的希望我能在这个表中解决格式问题,因为其他用户可能不想在他们的终端进行格式设置。您仍然没有回答SQL Server的哪个版本。当范围跨越几个月时,您的格式非常奇怪。例如“9月26日-2日”您使用的是哪个版本?我知道发生了什么。这应该是“9月26日-10月2日”。能否将范围的开始日、开始月、结束日和结束月作为单独的列返回,然后在应用程序的UI层中进行格式化?这一表有多种用途和多个目的地。我真的希望我能在这个表中解决格式问题,因为其他用户可能不想在他们的终端进行格式设置。您仍然没有回答SQL Server的哪个版本会产生预期的结果,而且非常简单。我加入了CAST只是为了以防万一,但我认为可能没有必要。如果你觉得卸下它舒服的话,可以稍微清理一下。我在没有演员的情况下试过了,但是前面的空格没有。演员阵容是必要的。这会产生预期的效果,而且非常简单。我加入演员阵容只是为了以防万一,但我认为可能没有必要。如果你觉得卸下它舒服的话,可以稍微清理一下。我在没有演员的情况下试过了,但是前面的空格没有。演员阵容是必要的。
replace(replace(
    concat(
        format(@d1, 'MMM ^dd'),
        ' - ',
        format(@d2,
            case when datediff(month, @d1, @d2) <> 0
                 then 'MMM ' else '' end + '^dd'
        )
    ), '^0', ' '), '^', '');