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