2011-05-22 36 views
1

我有数据库与项目表是在值DATETIME,月查询多到5月iself通过SubPublications表回报(演员?转换?),从一个独特的一年存储过程

加入到我的存储过程返回所有不同年 - 月的连击来自未与特定(由ID)出版物(因此2个PARAMS,见下文)指定类型的出版物的RELEASEDATE字段。

问题:
的PROC工作正常,但我想用1虚拟日期返回列类型DATETIME2因为它是现在,它返回一个整数的2列。 我该怎么做?

我知道我可以做转换在我的应用程序代码,但我宁愿把它交付从一个数据库中的日期时间。

我的SQL不是很大。我甚至不知道我是否应该使用演员阵容或转换器。

我不能在网上像这样的查询中转换回日期时间找到一个例子。谁能帮忙?下面是我写的PROC,因为它代表:

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 
+0

你说的“1虚设日期”是什么意思?啊,你mea“天” – gbn 2011-05-22 15:38:14

+2

考虑不命名你的存储过程,前缀为'sp_'。看到这个:http://sqlserverpedia.com/blog/sql-server-bloggers/stored-procedure-performance-using-%E2%80%9Csp_%E2%80%9D-prefix-%E2%80%93-myth - 或 - 事实/ – Tahbaza 2011-05-22 16:00:30

+0

@Tahbaza:我不知道。 +1。 – Faust 2011-05-22 20:30:38

回答

1

你不需要TOP和你不妨ORDER BY表达。

DATEADD/DATEDIFF expression会给你开始当月

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 

在这种情况下结果是一样的。

如果CAST是varchar,那么你会得到不同的结果。这就是为什么我倾向于使用表达式而不是别名,但它非常微不足道。当然,我会测试我的变化...,不是吗?

+0

是否有任何理由在order by子句中使用显式表达式而不是“myCol”别名? – Faust 2011-05-23 06:50:38

+0

@Faust:没理由。只需复制/粘贴。并更新了答案,干杯 – gbn 2011-05-23 06:54:40

1

DATEADD(MONTH, DATEDIFF(MONTH, '1600-01-01T00:00:00', ReleaseDate), '1600-01-01T00:00:00')应该让你的YYYY-MM-DD 00:00:00日期。 1600-01-01T00:00:00只是在您的ReleaseDate列中可能存储的任何日期之前选择的最佳日期。

相关问题