【问题标题】:Showing dates by day wise, and having default date based on condition按天显示日期,并根据条件设置默认日期
【发布时间】:2015-11-30 11:50:33
【问题描述】:

我正在附加一个查询以将日期带到字段中, 如果系统时间在下午 01:00 之前,那么它应该带今天日期+1,否则如果系统日期在或等于下午 01:00 之后,它应该带今天日期+2 此外,用户可以看到将显示日期范围和日期名称的查询结果,如果上述情况不是用户正在寻找的,则可以手动选择其中一个。

查询是可用的并且工作正常但分开, 一个查询带来日期范围,一个查询根据条件设置日期,我需要对它们进行一个查询,带来日期范围并根据条件设置默认日期; 以下是查询: 注意:Q No 2,我尝试将两个查询作为一个查询,但它没有带来正确的结果,无论系统时间是什么,它都会保持今天的日期+1。

1)

  If DATEPART(Hour,Getdate())<12
    SELECT GetDate()+1

    If DATEPART(Hour,Getdate())>=12
    SELECT GetDate()+2 

2)

If DATEPART(Hour,Getdate())<12
    DECLARE @Date1 DATE, @Date2 DATE
    SET @Date1 = GetDate()+0
    SET @Date2 = GetDate()+365

SELECT DATEADD(DAY,number+1,@Date1) [Date], DateName(Weekday,DATEADD(DAY,number+1,@Date1)) as dayname
FROM master..spt_values
WHERE type = 'P'
AND DATEADD(DAY,number+1,@Date1) < @Date2

If DATEPART(Hour,Getdate())>=12
    DECLARE @Date3 DATE, @Date4 DATE
    SET @Date3 = GetDate()+2
    SET @Date4 = GetDate()+365

SELECT DATEADD(DAY,number+1,@Date3) [Date], DateName(Weekday,DATEADD(DAY,number+1,@Date3)) as dayname
FROM master..spt_values
WHERE type = 'P'
AND DATEADD(DAY,number+1,@Date3) < @Date4

【问题讨论】:

    标签: sql sql-server tsql date


    【解决方案1】:

    我使用CTE 来计算开始日期。 CTE 使用CASE 语句来判断它是在 12 点之前还是之后运行。

    WITH Base AS
        (
            /* Returns the start date based on the current time.
             * Before midday the start date is today.
             * After midday it is the day after tomorrow.
             */
            SELECT
                CASE 
                    -- Use current time to calculate start date.
                    WHEN DATEPART(HOUR, GETDATE()) < 12 THEN DATEADD(DAY, 0, GETDATE())
                    ELSE DATEADD(DAY, 2, GETDATE())
                END AS StartDate
        )
    SELECT
        DATEADD(DAY, sv.Number + 1, b.StartDate)                    AS [Date],
        DATENAME(WEEKDAY, DATEADD(DAY, sv.Number + 1, b.StartDate))    AS [DateName]
    FROM
        master..spt_values AS sv
            CROSS JOIN Base AS b
    WHERE 
        sv.[type] = 'P'
        AND DATEADD(DAY, Number + 1, b.StartDate) < DATEADD(YEAR, 1, b.StartDate)
    ;
    

    【讨论】:

    • 您好@Release Object,感谢您的帮助,这将给出与查询 No1 相同的结果,我需要的是在查询 2 中带上日期名称的日期范围,但要设置默认日期取决于条件,因此默认情况下字段的值将取决于所提到的条件,但如果用户想要更改字段值,他将看到完整的日期并选择另一个日期
    • 我已经更新了我的查询。这次添加到默认日期的天数基于当前时间。我还更改了示例以更好地匹配您的原始查询。
    • 感谢您的努力,非常感谢,但即使系统上的时间是下午 5 点,它仍然显示日期 +1,而且日期与日期名称不匹配。
    • 我的错。您可能会注意到 CASE 语句在 13:00 之前返回 Number + 1。和数字+ 3之后。但是日期列总是返回 Number + 1。这需要第二个 CASE 语句。
    • 我再次编辑了我的答案。希望我正确理解了您的要求,
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-13
    • 2017-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多