SQL 服务器:使用当前 DATENAME 作为列名分配一个动态列名
SQL Server: Assign a dynamic column name using current DATENAME as column name
我正在使用以下查询 return 当前月份的所有日期 M/D/YYYY 格式:
SELECT DISTINCT FORMAT(findetail.endtime, 'M/d/yyyy') FROM position
JOIN findetail ON position.position = findetail.position
JOIN product ON position.product = product.product
WHERE MONTH(findetail.endtime) = MONTH(GETDATE())
AND YEAR(findetail.endtime) = YEAR(GETDATE())
ORDER BY FORMAT(findetail.endtime, 'M/d/yyyy')
这 return 是一个包含当月每个日期的列,但该列未命名。
| (No column name) |
_|__________________|_
| 2/1/2016 |
| 2/10/2016 |
| 2/11/2016 |
| 2/12/2016 |
| 2/13/2016 |
| ... |
对于杜松子酒,我想知道是否有一种方法可以使用当前日期的 DATENAME
作为查询中的列名,这样它就不会被硬编码?这仅用于强迫症目的,它没有完成任何事情,但我很好奇是否可能。我正在使用以下查询来获取日期名称:
SELECT DATENAME(MONTH, DATEADD(MONTH, MONTH(GETDATE()), 0) -1)
returns February
。从我收集到的信息来看,实现这一目标的唯一方法是使用动态 sql ,我从来没有搞砸过。任何帮助将不胜感激。目标是 return:
| February |
_|__________________|_
| 2/1/2016 |
| 2/10/2016 |
| 2/11/2016 |
| 2/12/2016 |
| 2/13/2016 |
| ... |
** 已更新 **
感谢您为我指明了正确的方向。这是我得到的。
查询:
DECLARE @sql NVARCHAR(MAX);
SET @sql = 'DECLARE @DateFrom DATE, @DateTo DATE;
SET @DateFrom = CONVERT(VARCHAR(10),DATEADD(m,-1,DATEADD(mm, DATEDIFF(m,0,GETDATE())+1, 0)), 101); -- FIRST DAY OF PREVIOUS MONTH
SET @DateTo = CONVERT(VARCHAR(10),DATEADD(d,-1,DATEADD(mm, DATEDIFF(m,0,GETDATE())+1,0)), 101); -- LAST DAY OF CURRENT MONTH
WITH Dates AS (
SELECT @DateFrom AS DatesInMonth
UNION ALL
SELECT DATEADD(d,1,DatesInMonth) FROM Dates WHERE DatesInMonth < @DateTo
)
SELECT FORMAT(DatesInMonth, ''M/d/yyyy'') AS '+ DATENAME(MONTH, GETDATE()) +' FROM Dates';
EXEC sp_executesql @sql
RETURNS:
| February |
_|__________________|_
| 2/1/2016 |
| 2/2/2016 |
| 2/3/2016 |
| 2/4/2016 |
| 2/5/2016 |
| ... |
修改了查询以正确排序结果而不是按第一个字符排序,并使用@JamieD77 的建议删除缩放器函数。
我正在使用以下查询 return 当前月份的所有日期 M/D/YYYY 格式:
SELECT DISTINCT FORMAT(findetail.endtime, 'M/d/yyyy') FROM position
JOIN findetail ON position.position = findetail.position
JOIN product ON position.product = product.product
WHERE MONTH(findetail.endtime) = MONTH(GETDATE())
AND YEAR(findetail.endtime) = YEAR(GETDATE())
ORDER BY FORMAT(findetail.endtime, 'M/d/yyyy')
这 return 是一个包含当月每个日期的列,但该列未命名。
| (No column name) |
_|__________________|_
| 2/1/2016 |
| 2/10/2016 |
| 2/11/2016 |
| 2/12/2016 |
| 2/13/2016 |
| ... |
对于杜松子酒,我想知道是否有一种方法可以使用当前日期的 DATENAME
作为查询中的列名,这样它就不会被硬编码?这仅用于强迫症目的,它没有完成任何事情,但我很好奇是否可能。我正在使用以下查询来获取日期名称:
SELECT DATENAME(MONTH, DATEADD(MONTH, MONTH(GETDATE()), 0) -1)
returns February
。从我收集到的信息来看,实现这一目标的唯一方法是使用动态 sql ,我从来没有搞砸过。任何帮助将不胜感激。目标是 return:
| February |
_|__________________|_
| 2/1/2016 |
| 2/10/2016 |
| 2/11/2016 |
| 2/12/2016 |
| 2/13/2016 |
| ... |
** 已更新 **
感谢您为我指明了正确的方向。这是我得到的。
查询:
DECLARE @sql NVARCHAR(MAX);
SET @sql = 'DECLARE @DateFrom DATE, @DateTo DATE;
SET @DateFrom = CONVERT(VARCHAR(10),DATEADD(m,-1,DATEADD(mm, DATEDIFF(m,0,GETDATE())+1, 0)), 101); -- FIRST DAY OF PREVIOUS MONTH
SET @DateTo = CONVERT(VARCHAR(10),DATEADD(d,-1,DATEADD(mm, DATEDIFF(m,0,GETDATE())+1,0)), 101); -- LAST DAY OF CURRENT MONTH
WITH Dates AS (
SELECT @DateFrom AS DatesInMonth
UNION ALL
SELECT DATEADD(d,1,DatesInMonth) FROM Dates WHERE DatesInMonth < @DateTo
)
SELECT FORMAT(DatesInMonth, ''M/d/yyyy'') AS '+ DATENAME(MONTH, GETDATE()) +' FROM Dates';
EXEC sp_executesql @sql
RETURNS:
| February |
_|__________________|_
| 2/1/2016 |
| 2/2/2016 |
| 2/3/2016 |
| 2/4/2016 |
| 2/5/2016 |
| ... |
修改了查询以正确排序结果而不是按第一个字符排序,并使用@JamieD77 的建议删除缩放器函数。