如何使用sql查询搜索birthdate?

时间:2014-02-26 04:51:39

标签: c# sql sql-server

我想从我的sql server数据库表中搜索<​​strong>出生日期。我得到的问题是 DOB 的年份会有所不同,并且会比当年更晚。如果我想获得客户名单,其生日将在接下来的7天内与facebook生日提醒相同。

我尝试将smalldatetime转换为varchar,并将LIKE语句与'_'外卡字符一起使用。例如Convert(Char(10),DOB,103) LIKE "__/02/____'。但是,它给了我DOB即将到来的客户列表。它还向我显示了那些生日在当前月份之前已经过去的数据。我只想要那些生日即将在未来7天内出现的数据。

我的应用程序是在 C#中开发的。如果可能使用DataTableDataView获得适当的结果,请建议我。

5 个答案:

答案 0 :(得分:2)

使用this method of date assembly,这应该有效:

<德尔>     选择 *     来自客户     其中DATEADD(日,日(DOB)-1,                DATEADD(月,月(DOB) - 1,                    DATEADD(年,年(CURRENT_TIMESTAMP) - 1900年,0)))         在CURRENT_TIMESTAMP和DATEADD之间(DD,7,CURRENT_TIMESTAMP);

修改
上述情况在一年的变化中没有奏效。 这样做虽然相当笨拙(使用@Today来测试场景,然后在完成时替换CURRENT_TIMESTAMP):

DECLARE @Today DATE = '31 Dec 2013';
select *
from Customers
CROSS JOIN
    (
        SELECT YEAR(@Today) AS yr
        UNION
        SELECT YEAR(DATEADD(d, 7, @Today))
    ) years
where 
    DATEADD(day, DAY(DOB) -1, 
           DATEADD(month, MONTH(DOB) - 1,
               DATEADD(year, years.yr - 1900, 0)))
    BETWEEN @Today AND DATEADD(DD, 7, @Today);

SqlFiddle here

如果我们接近年底,cross join将返回今年或今年和明年,如果年份相同,UNION将确保只有一行。如果返回2年(即我们在12月晚些时候),则介于两者之间将排除今年1月初发生的客户DOB:P必须有更优雅的解决方案,但是......

答案 1 :(得分:1)

尝试使用DATEPARTDATEADD以及DATEDIFF函数为查询设置where子句。以下WHERE子句可以获得所需的结果:

SELECT *
FROM [Table]
WHERE DATEADD(yy, DATEDIFF(yy, [DOB], GETDATE()) +
          CASE
              WHEN DATEPART(mm, GETDATE()) > 
                   DATEPART(mm, DATEADD(dd, 7, GETDATE())) 
               AND DATEPART(mm, GETDATE()) <> DATEPART(mm, [DOB])
                   THEN 1 
              ELSE 0
          END, [DOB]) 
      BETWEEN GETDATE() AND DATEADD(dd, 7, GETDATE())

该子句的作用是,它使用DATEADDDATEDIFF将[DOB]值移至当前年份,并在今天至今天的7天之间进行匹配。

编辑:修订该条款以满足年度周期。

答案 2 :(得分:0)

使用基于日期的功能。

//pseudo code
Where Month(birthdate) = 7
and Day(birthdate) = 4

将拉起7月4日出生的人

答案 3 :(得分:0)

我不在我的开发机器上,所以这是未经测试的,但应该指向正确的方向。

SELECT *
FROM TABLE
WHERE MONTH(DOB) = MONTH(GETDATE()) AND 
(DAY(DOB) BETWEEN DAY(GETDATE()) AND 
DAY(DATEADD(dd, 7, GETDATE())))

请注意,GETDATE()函数会获取计算机上当前时区的当前日期和时间。要使用UTC日期,请将GETDATE()替换为GETUTCDATE()

答案 4 :(得分:0)

使用StuartLC的示例作为基线。如何为每条记录建立DOB,而不是实际年份,使用当前年份和明年。通过这种方式,您可以将DateDiff用于两个日期的七天范围 - 这些日期处理年度翻转并且非常明确其意图。

示例:

DECLARE @Today DATE = '31 Dec 2013';

SELECT *
FROM Customers
WHERE
      cast(
          cast(Month(DOB) AS varchar) + '/' +
          cast(Day(DOB) AS varchar) + '/' +
          cast(Year(@Today) AS varchar) AS Date) BETWEEN @Today AND dateadd(day, 7, @Today)
OR
        cast(
          cast(Month(DOB) AS varchar) + '/' +
          cast(Day(DOB) AS varchar) + '/' +
          cast(Year(@Today) + 1 AS varchar) AS Date) BETWEEN @Today AND dateadd(day, 7, @Today)

Sql Fiddle here