我想从我的sql server数据库表中搜索<strong>出生日期。我得到的问题是 DOB 的年份会有所不同,并且会比当年更晚。如果我想获得客户名单,其生日将在接下来的7天内与facebook生日提醒相同。
我尝试将smalldatetime
转换为varchar
,并将LIKE
语句与'_'外卡字符一起使用。例如Convert(Char(10),DOB,103) LIKE "__/02/____'
。但是,它给了我DOB即将到来的客户列表。它还向我显示了那些生日在当前月份之前已经过去的数据。我只想要那些生日即将在未来7天内出现的数据。
我的应用程序是在 C#中开发的。如果可能使用DataTable
或DataView
获得适当的结果,请建议我。
答案 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);
如果我们接近年底,cross join
将返回今年或今年和明年,如果年份相同,UNION将确保只有一行。如果返回2年(即我们在12月晚些时候),则介于两者之间将排除今年1月初发生的客户DOB:P必须有更优雅的解决方案,但是......
答案 1 :(得分:1)
尝试使用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天之间进行匹配。
编辑:修订该条款以满足年度周期。
答案 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)