【问题标题】:How to filter Age from SQL Server如何从 SQL Server 中筛选年龄
【发布时间】:2016-04-27 00:43:07
【问题描述】:

我试图使用comboboxdatagridview 上创建一个过滤器。 我想做的是过滤datagridview中的过滤数据。 我有七个comboboxes 用于过滤。例如,第一个combobox 是年份,那么我仍然想将搜索过滤到年级,然后过滤到部分等等。因此,用户将能够对数据库中的搜索进行排序或过滤。

到目前为止,我有我的存储过程代码并在组合框中进行了尝试。 SchoolYearGradesectionGenderstatusAccount 过滤效果很好。除了年龄,我将查询设置为自动计算年龄而不保存到数据库中,现在我的问题就是过滤年龄。

我以这种方式完成了我的存储过程。

ALTER PROCEDURE [dbo].[uspYearGradeFilter]
    @Year Nvarchar(20) = NULL,
    @Grade Nvarchar(20) = NULL,
    @Section Nvarchar(20) = NUll,
    @Gender Nvarchar(20) = NULL,
    @Status Nvarchar(20) = NULL,
    @Status2 Nvarchar(20) = NULL,
    @Age Nvarchar(20) = NULL
AS
BEGIN
    SET NOCOUNT ON;

    SELECT 
        si.StudentID, SI.Surname, SI.FirstName, SI.MiddleName, 
        si.Gender, si.BirthDay, SI.TelNum,
        Birthday, getdate() AS [Today],
        Datediff(yy, BirthDay, getdate()) -
            CASE
                WHEN DATEADD(YY, DATEDIFF(YY, BirthDay, getdate()), BirthDay) > GETDATE() 
                  THEN 1
                  ELSE 0
            END AS [age]
    FROM 
        StudentInformation SI
    JOIN 
        StudentHistory SH ON SI.StudentID = SH.StudentID
    WHERE 
        sh.SchoolYear LIKE COALESCE('%'+ @Year+'%', sh.SchoolYear)
        AND sh.Levels LIKE COALESCE('%' + @Grade + '%', sh.Levels)
        AND SI.Gender LIKE COALESCE('%' + @Gender + '%', si.gender)
        AND SH.Section LIKE COALESCE('%' + @Section + '%', sh.Section) 
        AND Si.Status LIKE COALESCE('%' + @Status + '%', si.status) 
        AND Sh.Status2 LIKE COALESCE(@Status2 + '%', sh.status2)
        AND [Age] LIKE COALESCE('%' + @Age + '%', [Age])
END

但我得到一个错误:

消息 207,级别 16,状态 1,过程 uspYearGradeFilter,第 42 行
列名“年龄”无效

有人可以帮我解决这个问题吗?谢谢

【问题讨论】:

  • 旁注:到底为什么您将nvarchar(20) 用于像@Year 这样的参数,显然 是一个数值?请始终使用最合适的数据类型 - 对数值使用数值类型,对日期和时间使用日期和时间类型 - 而不仅仅是字符串!
  • @marc_s - 你不知道现代风格是将每个变量声明为字符串,然后在使用时使用.ToString()

标签: sql-server vb.net sql-server-2008


【解决方案1】:

您不能在直接的WHERE 子句中使用列别名。您可以在子查询中使用它:

SELECT * FROM
(
    SELECT 
        si.StudentID,
        SI.Surname,
        SI.FirstName,
        SI.MiddleName,
        si.Gender,
        si.BirthDay,
        SI.TelNum
        getdate() AS [Today],
        Datediff(yy,BirthDay,getdate()) -
                    CASE
                        WHEN DATEADD(YY, DATEDIFF(YY,BirthDay,getdate()),BirthDay) > GETDATE() 
                            THEN 1
                        ELSE 
                            0
                    END AS [age]
    FROM StudentInformation SI
    JOIN StudentHistory SH
        ON SI.StudentID = SH.StudentID
    WHERE 
        sh.SchoolYear LIKE COALESCE('%'+ @Year+'%', sh.SchoolYear)
        AND sh.Levels LIKE COALESCE('%' + @Grade + '%', sh.Levels)
        AND SI.Gender LIKE COALESCE('%' + @Gender + '%', si.gender)
        AND SH.Section LIKE COALESCE('%' + @Section + '%', sh.Section) 
        AND Si.Status LIKE COALESCE('%' + @Status + '%', si.status) 
        AND Sh.Status2 LIKE COALESCE(@Status2 + '%', sh.status2)
) t
WHERE [Age] LIKE COALESCE('%' + @Age + '%', [Age])

【讨论】:

  • 嗨,Felix,我在尝试您的代码时遇到错误。它说The column 'Birthday' was specified multiple times for 't'.
  • 删除子查询中的第二个生日。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-19
  • 2013-09-02
  • 1970-01-01
  • 2021-04-22
  • 1970-01-01
  • 1970-01-01
  • 2019-12-12
相关资源
最近更新 更多