Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MSSQL按日期排序,具有不同的_Sql_Sql Server_Tsql_Sql Order By - Fatal编程技术网

MSSQL按日期排序,具有不同的

MSSQL按日期排序,具有不同的,sql,sql-server,tsql,sql-order-by,Sql,Sql Server,Tsql,Sql Order By,下面有一个查询段,我正试图从表中的日期字段构建一个“月-年”字符串。非常重要的是,从本月开始到未来12个月,它以正确的顺序出现 DECLARE @cols AS NVARCHAR(MAX) SELECT @cols = STUFF( (SELECT N',' + QUOTENAME(y) AS [text()] FROM (SELECT DISTINCT CONVERT(char(3), StartDate, 0) + '-' + RIGHT(CONVERT(varchar, Y

下面有一个查询段,我正试图从表中的日期字段构建一个“月-年”字符串。非常重要的是,从本月开始到未来12个月,它以正确的顺序出现

DECLARE @cols AS NVARCHAR(MAX)
SELECT @cols = STUFF(
(SELECT N',' + QUOTENAME(y) AS [text()]
FROM (SELECT DISTINCT CONVERT(char(3), StartDate, 0) + '-' +  
      RIGHT(CONVERT(varchar, YEAR(StartDate)), 2) AS y 
      FROM Products2
     ) AS Y
--ORDER BY y desc
FOR XML PATH('')),
1, 1, N'')
这个查询没有按正确的顺序提取日期,我想看看你们是否知道按正确的顺序提取日期的巧妙方法。我可以引入startDate列并按该列进行排序,但它会引入重复项,因为同一个月可能有多个条目。我在这里创建了一个示例表

您可以使用

DECLARE @cols AS NVARCHAR(MAX);

SELECT @cols = STUFF((SELECT N',' + QUOTENAME(y) AS [text()]
                      FROM   (SELECT CONVERT(CHAR(3), StartDate, 0) + '-'
                                     + RIGHT(CONVERT(VARCHAR, YEAR(StartDate)), 2) AS y,
                                     MIN(StartDate)                                AS z
                              FROM   Products2
                              GROUP  BY CONVERT(CHAR(3), StartDate, 0) + '-'
                                        + RIGHT(CONVERT(VARCHAR, YEAR(StartDate)), 2)) AS Y
                      ORDER  BY z
                      FOR XML PATH('')), 1, 1, N'');

SELECT @cols; 
您可以使用

DECLARE @cols AS NVARCHAR(MAX);

SELECT @cols = STUFF((SELECT N',' + QUOTENAME(y) AS [text()]
                      FROM   (SELECT CONVERT(CHAR(3), StartDate, 0) + '-'
                                     + RIGHT(CONVERT(VARCHAR, YEAR(StartDate)), 2) AS y,
                                     MIN(StartDate)                                AS z
                              FROM   Products2
                              GROUP  BY CONVERT(CHAR(3), StartDate, 0) + '-'
                                        + RIGHT(CONVERT(VARCHAR, YEAR(StartDate)), 2)) AS Y
                      ORDER  BY z
                      FOR XML PATH('')), 1, 1, N'');

SELECT @cols; 

如果您使用的是
SQL Server 2012+
,则可以使用以下功能:

DECLARE @cols AS NVARCHAR(MAX);

;WITH cte AS       -- get only one date per month/year
(
  SELECT MIN(StartDate) AS StartDate
  FROM #Products2 
  GROUP BY YEAR(StartDate),MONTH(StartDate)
)
SELECT @cols = STUFF((SELECT  ',' + QUOTENAME(FORMAT(StartDate, 'MMM-yy'))
                      FROM cte
                      ORDER BY StartDate      
                      FOR XML PATH('')),
                    1, 1, N'');

SELECT @cols;

输出:

╔══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╗
║                                                        result                                                        ║
╠══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╣
║ [Dec-15],[Jan-16],[Feb-16],[Mar-16],[Apr-16],[May-16],[Jun-16],[Jul-16],[Aug-16],[Sep-16],[Oct-16],[Nov-16],[Dec-16] ║
╚══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╝

如果您使用的是
SQL Server 2012+
,则可以使用以下函数:

DECLARE @cols AS NVARCHAR(MAX);

;WITH cte AS       -- get only one date per month/year
(
  SELECT MIN(StartDate) AS StartDate
  FROM #Products2 
  GROUP BY YEAR(StartDate),MONTH(StartDate)
)
SELECT @cols = STUFF((SELECT  ',' + QUOTENAME(FORMAT(StartDate, 'MMM-yy'))
                      FROM cte
                      ORDER BY StartDate      
                      FOR XML PATH('')),
                    1, 1, N'');

SELECT @cols;

输出:

╔══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╗
║                                                        result                                                        ║
╠══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╣
║ [Dec-15],[Jan-16],[Feb-16],[Mar-16],[Apr-16],[May-16],[Jun-16],[Jul-16],[Aug-16],[Sep-16],[Oct-16],[Nov-16],[Dec-16] ║
╚══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╝

看起来您刚刚得到月/年,因此我们可以截断到月的第一天,并将其包含在查询中

DATEADD(month, DATEDIFF(month, 0, StartDate), 0)  monthStart
现在我们可以通过它订购:

DECLARE @cols AS NVARCHAR(MAX);


 SELECT @cols = STUFF(
  (SELECT N',' + QUOTENAME(y) AS [text()]
  FROM (
        SELECT DISTINCT CONVERT(char(3), StartDate, 0) + '-' +  
        RIGHT(CONVERT(varchar, YEAR(StartDate)), 2) AS y, 
        DATEADD(month, DATEDIFF(month, 0, StartDate), 0)  monthStart
        FROM Products2
       ) AS Y
  ORDER BY monthStart
  FOR XML PATH('')),
1, 1, N'');

select @cols;
这是输出:

[Dec-15]、[Jan-16]、[Feb-16]、[Mar-16]、[Apr-16]、[May-16]、[Jun-16]、[Jul-16]、[Jul-16]、[Aug-16]、[Sep-16]、[Oct-16]、[Nov-16]、[Dec-16]

这就是你要找的吗?这是一把小提琴:

更好的是,只需选择不同的月份开始日期,然后仅对其进行字符串转换

   DECLARE @cols AS NVARCHAR(MAX);

     SELECT @cols = STUFF(
      (SELECT N',' + QUOTENAME(CONVERT(char(3), monthStart, 0) + '-' +  
            RIGHT(CONVERT(varchar, YEAR(monthStart)), 2)) AS [text()]
      FROM (
            SELECT DISTINCT 
                DATEADD(month, DATEDIFF(month, 0, StartDate), 0)  monthStart
      FROM Products2
           ) AS Y
      ORDER BY monthStart
      FOR XML PATH('')),
    1, 1, N'');

    select @cols;
这是小提琴:

看起来您刚刚得到了月份/年份,因此我们可以截断到月份的第一天,并将其包含在查询中

DATEADD(month, DATEDIFF(month, 0, StartDate), 0)  monthStart
现在我们可以通过它订购:

DECLARE @cols AS NVARCHAR(MAX);


 SELECT @cols = STUFF(
  (SELECT N',' + QUOTENAME(y) AS [text()]
  FROM (
        SELECT DISTINCT CONVERT(char(3), StartDate, 0) + '-' +  
        RIGHT(CONVERT(varchar, YEAR(StartDate)), 2) AS y, 
        DATEADD(month, DATEDIFF(month, 0, StartDate), 0)  monthStart
        FROM Products2
       ) AS Y
  ORDER BY monthStart
  FOR XML PATH('')),
1, 1, N'');

select @cols;
这是输出:

[Dec-15]、[Jan-16]、[Feb-16]、[Mar-16]、[Apr-16]、[May-16]、[Jun-16]、[Jul-16]、[Jul-16]、[Aug-16]、[Sep-16]、[Oct-16]、[Nov-16]、[Dec-16]

这就是你要找的吗?这是一把小提琴:

更好的是,只需选择不同的月份开始日期,然后仅对其进行字符串转换

   DECLARE @cols AS NVARCHAR(MAX);

     SELECT @cols = STUFF(
      (SELECT N',' + QUOTENAME(CONVERT(char(3), monthStart, 0) + '-' +  
            RIGHT(CONVERT(varchar, YEAR(monthStart)), 2)) AS [text()]
      FROM (
            SELECT DISTINCT 
                DATEADD(month, DATEDIFF(month, 0, StartDate), 0)  monthStart
      FROM Products2
           ) AS Y
      ORDER BY monthStart
      FOR XML PATH('')),
    1, 1, N'');

    select @cols;
这是小提琴:

非常感谢您的帮助。非常感谢。非常感谢你的帮助。非常感谢。非常感谢你的帮助。非常感谢。非常感谢你的帮助。非常感谢。我认为上面的第二个解决方案是最好的解决方案,因为字符串转换更少。在转换之前,您将获得不同的行。在group by和select语句中使用字符串转换比上面的选择更好。非常感谢您的帮助。我认为上面的第二个解决方案是最好的解决方案,因为字符串转换更少。在转换之前,您将获得不同的行。在group by和select语句中进行字符串转换比上面的选择更好。非常感谢您的帮助。