视图输出(dd/mm/yyy)SQL Server上的日期筛选器

视图输出(dd/mm/yyy)SQL Server上的日期筛选器,sql,sql-server,Sql,Sql Server,我从一个视图获取输出,该视图有一列CreatedDate,该列以dd/mm/yyyy格式返回。我想代表date筛选输出,但没有显示任何内容。有人能帮我吗 SQL Server代码: ;with CTE as ( select CreatedDate, UserID, UserName, SUM([CreditedAmount]) as CreditedAmount, SUM([TDSPercent]) a

我从一个视图获取输出,该视图有一列
CreatedDate
,该列以
dd/mm/yyyy
格式返回。我想代表date筛选输出,但没有显示任何内容。有人能帮我吗

SQL Server代码:

;with CTE as 
(
    select 
        CreatedDate,
        UserID,
        UserName,
        SUM([CreditedAmount]) as CreditedAmount,
        SUM([TDSPercent]) as TDSPercent,
        SUM([TDSAmount]) as TDSAmount,
        SUM(ISNULL([ApplicationServicePercentage], 0)) as ApplicationServicePercentage,
        SUM(ISNULL([ApplicationServiceAmount], 0)) as ApplicationServiceAmount,
        SUM([CreditedAmount]) - SUM([DebitedAmount]) - SUM(ISNULL([TDSAmount], 0)) - SUM(ISNULL([ApplicationServiceAmount], 0)) as AmountToPay
    from 
        [dbo].[vwGetPaymentStatement]
    where 
        [Status] = 0
        and UserStatus = 1
    group by 
        UserID, UserName, CreatedDate
)
select 
    CreatedDate,
    UserID, UserName,
    CreditedAmount, TDSPercent, TDSAmount,
    ApplicationServicePercentage,
    ApplicationServiceAmount,
    AmountToPay
from
    CTE
where 
    AmountToPay is not null
    and (UserID = @uid or UserName like '%' + @username + '%')
    and (CreatedDate between @datefrom and @dateto)

如果它不起作用,尝试铸造到目前为止

(在@datefrom和dateto之间强制转换(CreatedDate作为datetime)


希望您已经将变量声明为datetime,并且不需要强制转换这些变量

根据您的评论和对其他答案的回复,我知道:
您的CreatedDate字段是一个
VARCHAR

CreatedDate字段包含的数据不是正确的日期

我首先运行CTE的定义,并添加一个帮助查找非日期值,如下所示:

select 
        CreatedDate,
        UserID,
        UserName,
        SUM([CreditedAmount]) as CreditedAmount,
        SUM([TDSPercent]) as TDSPercent,
        SUM([TDSAmount]) as TDSAmount,
        SUM(ISNULL([ApplicationServicePercentage], 0)) as ApplicationServicePercentage,
        SUM(ISNULL([ApplicationServiceAmount], 0)) as ApplicationServiceAmount,
        SUM([CreditedAmount]) - SUM([DebitedAmount]) - SUM(ISNULL([TDSAmount], 0)) - SUM(ISNULL([ApplicationServiceAmount], 0)) as AmountToPay
    from 
        [dbo].[vwGetPaymentStatement]
    where 
        [Status] = 0
        and UserStatus = 1
        and isdate(createddate) = 0  --- > Added this row to find the non-date values
    group by 
        UserID, UserName, CreatedDate

一旦您弄清楚如何处理这些非日期值,您就应该没事了。除非@datefrom和@dateto变量的数据类型有问题。

步骤1,请删除where子句并运行查询。如果您获得记录,请一次添加一个筛选器,直到停止获取记录。你添加的最后一件事将是罪魁祸首。嗨,丹,我在创建日期上有过滤器
CreatedDate
的数据类型是什么?如果不是日期/日期时间数据类型,那就是您的问题。当我尝试强制转换时,下面的错误消息引发了从varchar数据类型到日期时间数据类型的转换,导致值超出范围。如果删除where中的BEVER子句并显示CreatedDate“date”数据您将看到分配给createddate的值的日期格式不正确。我认为您是对的。主要输出来自转换(char(10),createdDate,103)格式的视图。这就是我不能过滤的原因吗?你必须像这样反转日期和月份:cast(子字符串(convert(char(10),createdDate,103),4,2)+'/'+left(convert(char(10),createdDate,103),2)+'/'+right(convert(char(10),createdDate,103),4)作为日期时间)
   SELECT createddate, 
       userid, 
       username, 
       creditedamount, 
       tdspercent, 
       tdsamount, 
       applicationservicepercentage, 
       applicationserviceamount, 
       amounttopay 
FROM   cte 
WHERE  amounttopay IS NOT NULL 
       AND ( userid = @uid 
              OR username LIKE '%' + @username + '%' ) 
       AND ( createddate BETWEEN CONVERT(VARCHAR, Cast(@datefrom AS DATETIME), 
                                 103) AND 
                                       CONVERT(VARCHAR, Cast(@dateto AS DATETIME 
                                                        ), 103)