2013-05-20 100 views
0

我在做什么是使用自己的函数,这是返回字符串,现在我想这个列进行排序,而使用它进行排序时,它没有正确排序,因为它一个字符串,当我试图转换为日期时间它会导致错误。转换日期和/或时间从字符串转换失败

任何帮助吗?

非常感谢。

SELECT 
    b.CallId, 
    CONVERT(VARCHAR(25), b.ETADate, 103) as'ETADate', 
    dbo.getCallEntrySerialNoLastTranDateTime(b.CallEntrySerialNumbersId) AS 'closingDateTime' 
FROM 
    CallEntry AS a, CallEntrySerialNumbers AS b  
WHERE 
    a.ASPId = 2 
    AND a.CompanyId = 3 
    AND a.CallId= b.CallId 
    AND a.ProdCompanyId = 1 
    AND b.CallCaseId IS NOT NULL 
    AND b.CallCaseId NOT LIKE 'NA' 
    AND ProdCategoryid = 1 
    AND a.CallDateTime > dateadd(day, -30, getdate()) 
    AND b.StatusId = 2 
ORDER BY 
    dbo.getCallEntrySerialNoLastTranDateTime(b.CallEntrySerialNumbersId) ASC 

// what I tried and causes above error is 
ORDER BY 
    CONVERT(DATE, dbo.getCallEntrySerialNoLastTranDateTime(b.CallEntrySerialNumbersId)) asc 

编辑,添加功能

ALTER FUNCTION [dbo].[ASP_getCallEntrySerialNoLastTranDateTime] 
(
    @CallEntrySerialNumbersId bigint 

) 
RETURNS varchar(500) 
AS 
BEGIN 

    DECLARE @ReturnVal NVARCHAR(500); 
    begin 

    select @ReturnVal = (select Top 1 CONCAT(CONVERT(VARCHAR(10),CallTranEndDateTime,103),' ',CONVERT(VARCHAR(10),CallTranEndDateTime,108)) from calltransactions 
    where CallEntrySerialNumbersId = @CallEntrySerialNumbersId AND CallTranTypeId = 3 
     order by CallTranId desc) 

    end;  

    RETURN @ReturnVal; 
END 
+0

你能告诉什么样的函数返回,即什么格式的字符串一些例子吗?如果你的函数应该返回一个'datetime'值 - 顾名思义 - 你能改变这个函数吗? – Pondlife

+0

我也给过功能,功能可以不必更新,因为已经用于太多的SP。 –

+0

您似乎将日期转换为字符串 - 很多。保持所有值都为'datetime'值,直到它们实际显示给用户 - 如果可能,请保留转换以显示/格式化甚至不是SQL的代码。而且,好吧,你不能改变这个函数 - 所以创建一个新的实际返回数据的日期时间' –

回答

0

尝试这一个 -

SET DATEFORMAT dmy 

SELECT * 
FROM (
    SELECT 
      b.CallId 
     , ETADate = CONVERT(VARCHAR(25), b.ETADate, 103) 
     , closingDateTime = dbo.getCallEntrySerialNoLastTranDateTime(b.CallEntrySerialNumbersId) 
    FROM dbo.CallEntry a 
    JOIN dbo.CallEntrySerialNumbers b ON a.CallId = b.CallId 
    WHERE a.ASPId = 2 
     AND a.CompanyId = 3 
     AND a.ProdCompanyId = 1 
     AND ISNULL(b.CallCaseId, '') NOT LIKE 'NA' 
     AND ProdCategoryid = 1 
     AND a.CallDateTime > DATEADD(day, -30, GETDATE()) 
     AND b.StatusId = 2 
) d 
ORDER BY CAST(d.closingDateTime AS DATE) 

ALTER FUNCTION [dbo].[ASP_getCallEntrySerialNoLastTranDateTime] 
(
    @CallEntrySerialNumbersId BIGINT 
) 
RETURNS VARCHAR(30) 
AS BEGIN 

    DECLARE @ReturnVal VARCHAR(30) 

    SELECT @ReturnVal = ( 
     SELECT TOP 1 CONVERT(VARCHAR(10), CallTranEndDateTime, 103) + ' ' + CONVERT(VARCHAR(10), CallTranEndDateTime, 108) 
     FROM dbo.CallTransactions 
     WHERE CallEntrySerialNumbersId = @CallEntrySerialNumbersId 
      AND CallTranTypeId = 3 
     ORDER BY CallTranId DESC 
    ) 

    RETURN @ReturnVal 

END 
+0

没有得到你想要做的事情? –

+0

什么是返回dbo.getCallEntrySerialNoLastTranDateTime(b.CallEntrySerialNumbersId)? – Devart

+0

它返回日期和时间字符串检查编辑。谢谢。 –

相关问题