【问题标题】:How to get 30 days from today including the month january如何获得从今天开始的 30 天,包括一月份
【发布时间】:2013-12-23 10:32:09
【问题描述】:

我的 sql 表包含许多人的出生日期。日期格式为 mm/dd/yyyy。我想选择未来 30 天内生日的人的详细信息。我为此使用以下查询,

 SELECT Mem_FirstNA, Mem_LastNA, Mem_DOB FROM MemberDetails WHERE 
 ltrim(str(year(GETDATE()))) + -' + ltrim(str(month(Mem_DOB))) + '-' + 
 ltrim(str(day(Mem_DOB))) >= getdate() - 1 AND 
ltrim(str(year(GETDATE()))) + '-' + ltrim(str(month(Mem_DOB))) + '-' + 
 ltrim(str(day(Mem_DOB))) <= getdate() + 30

完整的代码是

public List<MemberData> GetThisMonthBirthday()
    {
        List<MemberData> MD = new List<MemberData>();
        using (SqlConnection con = new SqlConnection(Config.ConnectionString))
        {
           using (SqlCommand cmd = new SqlCommand("SELECT Mem_FirstNA, Mem_LastNA, Mem_DOB FROM MemberDetails WHERE ltrim(str(year(GETDATE()))) + '-' + ltrim(str(month(Mem_DOB))) + '-' +  ltrim(str(day(Mem_DOB))) >= getdate() - 1 AND ltrim(str(year(GETDATE()))) + '-' + ltrim(str(month(Mem_DOB))) + '-' +  ltrim(str(day(Mem_DOB))) <= getdate() + 30", con))

           {
                try
                {
                    con.Open();
                    SqlDataReader reader = cmd.ExecuteReader();
                    while (reader.Read())
                    {
                     MemberData mb = new MemberData();
                     mb.Mem_NA = (string)reader["Mem_FirstNA"];
                     mb.Mem_LastNA =(string)reader["Mem_LastNA"];
                     mb.Mem_DOB = (Convert.ToDateTime(reader["Mem_DOB"]));
                     MD.Add(mb);
                   }

                }
                catch (Exception e) { throw e; }
                finally { if (con.State == System.Data.ConnectionState.Open) con.Close(); }
                return MD;
            }
        }

问题是这个检查只到 12 月 31 日,如果人的生日是 01/01/1987 ,则查询没有选择该详细信息。请帮我解决这个问题。谢谢

【问题讨论】:

  • 假设您要在 SQL 中执行此操作,它与 C# 有什么关系?
  • 将您的出生日期字符串转换为真实日期并使用 dateadd() 提前 30 天
  • @JonSkeet:我正在使用 c# 做我的项目
  • 是的,您一些 C# 代码 - 但您想要回答的问题是只是在 SQL 中,对吗?您不想获取每个人的记录并在 C# 中进行过滤。所以C#部分是无关紧要的。此外,您的编辑将 SQL 全部放在一行中,非常更难阅读。

标签: c# sql


【解决方案1】:

有很多方法可以做到这一点,您需要条件逻辑,具体取决于您是否在年底的 30 天内。如果您使用的是 SQL Server,我会将逻辑包装在一个函数中以使其更具可读性,例如:

CREATE FUNCTION [dbo].[IsBirthdayInRange]
(
    @Birthday DATETIME,
    @StartDate DATETIME,
    @EndDate DATETIME
)
RETURNS BIT
AS
BEGIN
    DECLARE @StartMonthDay INT
    DECLARE @EndMonthDay INT
    DECLARE @BirthdayMonthDay INT

    SET @StartMonthDay = MONTH(@StartDate) * 100 + DAY(@StartDate)
    SET @EndMonthDay = MONTH(@EndDate) * 100 + DAY(@EndDate)
    SET @BirthdayMonthDay = MONTH(@Birthday) * 100 + DAY(@Birthday)

    IF YEAR(@StartDate) <> YEAR(@EndDate) 
    BEGIN
        IF @BirthdayMonthDay >= @StartMonthDay OR @BirthdayMonthDay <= @EndMonthDay 
        BEGIN
            RETURN 1
        END
    END
    ELSE
        BEGIN
        IF @BirthdayMonthDay >= @StartMonthDay AND @BirthdayMonthDay <= @EndMonthDay 
        BEGIN
            RETURN 1
        END
    END
    RETURN 0
END

然后您可以将其用作:

...
WHERE IsBirthdayInRange(Mem_DOB, GETDATE(), GETDATE() + 30)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多