使用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
为了产生单位数日值的领先空间,我可以抛出一些案例逻辑,但它看起来很难看。
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;
虽然结果是我需要的,但代码很丑陋且难以阅读。是否有更简单的方法来产生相同的结果?
答案 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