Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用sql查询搜索生日?_C#_Sql_Sql Server - Fatal编程技术网

C# 如何使用sql查询搜索生日?

C# 如何使用sql查询搜索生日?,c#,sql,sql-server,C#,Sql,Sql Server,我想从我的sql server数据库表中搜索出生日期。我得到的问题是,DOB的年份将不同,并且将晚于今年。如果我想获得客户名单,其生日将在未来7天内与facebook生日提醒相同 我曾尝试将smalldatetime转换为varchar,并使用带有“\u1”通配符的LIKE语句。例如,ConvertChar10、DOB、103类似于_u/02/__u’。但是,它给了我本月DOB即将到来的客户名单。它还向我显示了那些在本月之前生日已经过去的数据。我只想要那些在接下来的7天生日即将到来的数据 我的应

我想从我的sql server数据库表中搜索出生日期。我得到的问题是,DOB的年份将不同,并且将晚于今年。如果我想获得客户名单,其生日将在未来7天内与facebook生日提醒相同

我曾尝试将smalldatetime转换为varchar,并使用带有“\u1”通配符的LIKE语句。例如,ConvertChar10、DOB、103类似于_u/02/__u’。但是,它给了我本月DOB即将到来的客户名单。它还向我显示了那些在本月之前生日已经过去的数据。我只想要那些在接下来的7天生日即将到来的数据


我的应用程序是用C语言开发的。如果可以使用DataTable或DataView获得适当的结果,请建议我。

使用基于日期的函数

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

将调出7月4日出生的人

我不在我的开发机器上,因此这是未经测试的,但应该为您指出正确的方向

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

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

尝试使用DATEPART、DATEADD和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())
该子句的作用是,它使用DATEADD和DATEDIFF将[DOB]值移动到当前年份,并在今天和从今天开始的7天之间进行匹配

编辑:修改该条款以适应全年周期。

使用,这应适用于:

挑选* 来自客户 其中DATEADDday,DAYDOB-1, DATEADDmonth,MONTHDOB-1, DATEADDyear,YEARCURRENT_时间戳-1900,0 在当前_时间戳和DATEADDDD之间,7,当前_时间戳;

编辑 上述措施在今年的变化中并不奏效。 虽然使用@Today来测试场景相当笨拙,但在完成测试后,用@Today代替当前的\u时间戳:

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);

如果我们快到年底,交叉连接将在今年或今年和明年再次出现,如果年份相同,工会将只确保一行。如果返回2年,即我们在12月底,那么中间将排除今年1月发生的客户的DOB:P必须有一个更优雅的解决方案,但是…

使用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)

这是行不通的,因为一旦超过两个月,你就得不到正确的数据。@FarligOpptreden说得对。我没有考虑……这不是解决OP问题,而是将日期与特定的日期和月份相匹配。我们的想法是从今天到7天之间获取日期,因此您无法将其与特定的日期和/或月份进行匹配。为什么不将DOB和今天之间的年差添加到DOB中,并根据我在回答中发布的结果进行匹配?我以前使用过无数次这种方法,它总是100%有效…可能重复的检查这似乎也错过了edge案例,今天是12月31日,客户的生日将在1月的第一周到来?。Fiddle Updated也忙着修改答案-刚刚测试过,你是对的。