Sql server 从存储过程中的不同年、月查询返回(Cast?Convert?)值作为日期时间

Sql server 从存储过程中的不同年、月查询返回(Cast?Convert?)值作为日期时间,sql-server,stored-procedures,Sql Server,Stored Procedures,我有一个数据库,其中有一个Publications表,可以通过一个子Publications表连接到iself 我的存储过程从指定类型的发布的ReleaseDate字段返回所有不同的年-月组合,这些发布与特定的by id发布无关,因此返回2个参数,请参见下文 问题: 该过程工作正常,但我希望返回列类型为DateTime2,伪日期为1。现在,它返回两列整数。我该怎么做 我知道我可以在我的应用程序代码中进行转换,但我更希望它作为数据库的日期时间交付 我的SQL不是很好。我甚至不知道我应该使用演员阵容

我有一个数据库,其中有一个Publications表,可以通过一个子Publications表连接到iself

我的存储过程从指定类型的发布的ReleaseDate字段返回所有不同的年-月组合,这些发布与特定的by id发布无关,因此返回2个参数,请参见下文

问题: 该过程工作正常,但我希望返回列类型为DateTime2,伪日期为1。现在,它返回两列整数。我该怎么做

我知道我可以在我的应用程序代码中进行转换,但我更希望它作为数据库的日期时间交付

我的SQL不是很好。我甚至不知道我应该使用演员阵容还是转换

在这样的查询中,我找不到在线转换回datetime的示例。有人能帮忙吗?以下是我所写的程序:

ALTER PROCEDURE sp_DistinctPubMonthYears 
    @PubType char(1),
    @PubId int = 0      
AS
BEGIN
SELECT 
    DISTINCT TOP (100) PERCENT 
        DATEPART(month, ReleaseDate) AS month, 
        DATEPART(year, ReleaseDate) AS year         
    FROM(         
        SELECT 
            Publications.ReleaseDate AS ReleaseDate,
            Publications.PublicationId As PubId,
            Publications.PubType AS PubType,
            SubPublications.PublicationId AS ParentId
        FROM 
            Publications LEFT JOIN SubPublications
        ON 
            Publications.PublicationId = SubPublications.PublicationId 
        WHERE
            Publications.PubType = @PubType AND
            Publications.PublicationId <> @PubId AND
            (
                SubPublications.PublicationId <> @PubId OR  
                /*either it's parent is NOT the one we're searching on or */
                SubPublications.PublicationId IS NULL  
                /*or it's not joined to anything at all */
            )               
    ) AS sub
ORDER BY year ASC, month ASC 
END
GO

DATEADDMONTH,DATEDIFFMONTH,'1600-01-01T00:00:00',ReleaseDate,'1600-01-01T00:00:00'应为您提供yyyy-MM dd 00:00:00日期。1600-01-01T00:00:00只是一个任意的日期,最好选择在您可能存储在ReleaseDate列中的任何日期之前。

您不需要TOP,也可以按表达式排序

这将为您提供本月的开始时间

SELECT DISTINCT
    CAST(
      DATEADD(month, DATEDIFF(month, 0, ReleaseDate), 0) AS datetime2
    ) AS myCol 
FROM(         
...
ORDER BY
    DATEADD(month, DATEDIFF(month, 0, ReleaseDate), 0)
编辑:正如浮士德提到的,如果您愿意,我们可以用别名订购

...
ORDER BY
    myCol
在这种情况下,结果是相同的


如果强制转换为varchar,则会得到不同的结果。这就是为什么我倾向于使用表达式而不是别名,但它非常简单。当然我会测试我的变化…,不是吗?

你说的虚拟日期1是什么意思?啊,您的意思是考虑不将存储过程命名为前缀为sp_。看这个:@Tahbaza:我不知道+1.在order by子句中是否有任何理由使用显式表达式而不是mycl别名?@Faust:没有理由。只需复制/粘贴。更新答案,干杯