【问题标题】:select birthday upcoming month选择下个月的生日
【发布时间】:2012-06-11 06:53:59
【问题描述】:

我想显示下个月的生日列表。

生日存储在birthday 列中。如何显示这个?

【问题讨论】:

  • 那么您需要使用生日值和当前年份的DayMonth 创建一个新的日期时间。
  • 向我们展示您的表结构和一些示例数据!
  • 你能说得具体一点吗?你用什么列。字段类型。那时也许我无法提供帮助。
  • msdn.microsoft.com/fr-fr/library/ms188383%28v=sql.90%29 获取当前月份、年份,并与您的列的月份、年份进行比较。如果您在尝试过某事后遇到问题,请回来。提示:查看 GETDATE、MONTH 和 YEAR,或 DATEADD
  • Itzik Ben Gan 在 Inside SQL Server 系列中对此进行了介绍。 See the accepted answer here 总结。

标签: c# sql sql-server sql-server-2005


【解决方案1】:

我首选的解决方案是增加一个可以索引的列; next_birthday.

作为一个夜间过程,您会更新该列以确保该值始终是未来的值。

这允许进行如下查询:

SELECT
  myfriends.*
FROM
  user               AS myself
INNER JOIN
  user               AS myfriends
    ON  myfriends.next_birthday >=                   myself.next_birthday
    AND myfriends.next_birthday <  DATEADD(MONTH, 1, myself.next_birthday)

这保留了日期时间字段的year 部分,因此可以很好地处理going around the corner
- 如果我的下一个生日是2012-12-15
- 我想要 12 月下半月的生日一月上半月的生日
- 仅使用日期和月份的解决方案(不是年份) 解决这个问题

该字段可以被索引,因此该解决方案不需要扫描表中的每条记录。

但是,它确实假设您可以运行该维护作业来更新该字段。在作业未执行的地方,部分数据将过期。

你还需要小心那些生日在29th Feb 的人——你不能一直在他们的生日上加一年; 29th Feb + 1 year 移动到 28th feb,无论您添加多少年,您都永远不会回到 29th Feb。但这并不太难......

UPDATE
  user
SET
  next_birthday = DATEADD(YEAR, DATEDIFF(YEAR, birthday, GETDATE()) + 1, birthday)
WHERE
  next_birthday < GETDATE()

所有这一切的范围也非常狭窄。它为一个非常特殊的需求引入了一个新的色谱柱和一个新的维护工作。然后应该问这个问题;这些成本是否优于替代查询(通常需要表扫描等)

【讨论】:

  • 感谢您的支持。我想选择即将到来的生日,然后按月显示 gridControl 的结果。所以我需要分开一个月。 @Dems
  • @mbbp - 您可能想在 around the corner 案例中测试接受的答案,处理从 12 月 (12) 到 1 月 (1) 的翻转。
【解决方案2】:
Select birthdaycolumn from yourtable where MONTH(birthdaycolumn) = MONTH(GETDATE()) 

试试这个就行了

【讨论】:

  • 如果 OP 真的想要在一个月内作为 GETDATE()DATEADD(MONTH,1,GETDATE()) 之间的含义?
  • getddate() 和 MONTH(GETDATE+1()) 之间
  • @Zoya - 如果基准日期是 2012-12-15 怎么办?如何仅显示 12 月下半月的生日以及 1 月上半月的生日?
【解决方案3】:

试试这个

Select * 
from yourDataTable
where MONTH(birthdaycolumn) = (MONTH(GETDATE() + 1)) 

【讨论】:

  • 1. 如果 OP 想要 the next month 包括从月中开始怎么办?例如,如果基准日期是2012-12-15,您将如何仅显示 12 月下半月的生日加上 1 月上半月的生日? 2). 即使你纯粹在日历月做,在GETDATE() 上加 1 也没什么用。
【解决方案4】:

试试这样的:

SELECT BirthDay 
FROM TableName
WHERE DATEPART(m, BirthDay) = UpcomingMonth 

在此 SQL 查询中使用 UpcomingMonth 作为参数。希望这会有所帮助。

【讨论】:

  • 参数以@符号为前缀
  • 如果 OP 想要下个月(包括从月中开始)怎么办?例如,如果基准日期是 2012-12-15,您将如何仅显示 12 月下半月的生日加上 1 月上半月的生日?
【解决方案5】:

解决了这个问题。

select * from Employee

where convert(nvarchar,convert(datetime,convert(nvarchar,YEAR(GETDATE()))+'.'+convert(nvarchar,MONTH(Birthday))+'.'+convert(nvarchar,DAY(Birthday))),102) between convert(nvarchar,getdate(),102) and convert(nvarchar,DATEADD(D,14 ,GETDATE()),102)

【讨论】:

    猜你喜欢
    • 2012-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-03
    • 2018-02-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多