0

您好,感谢您的关注。

我为我的垒球队编写了一个简单的应用程序,但我遇到了一些需要重写的查询问题。

SELECT DISTINCT 
    _StartDate, _RescheduleDate, _GameTime, _FieldNumber, _Notes
FROM
    _Schedule
WHERE
    (_StartDate >= DATEADD(wk, 0, { fn NOW() })) 
    AND (_StartDate < DATEADD(wk, 1, { fn NOW() }))

此查询仅获取即将到来的几周比赛时间表。我需要做的但我忘记了,还要检查_RescheduleDates我们目前有 1 或 2 场比赛被重新安排。所以我需要以某种方式修改它以检查重新安排日期是否具有有效日期而不是“TBD”或NULL。

第二个问题是,我们的比赛是在星期五,比赛当天,这会将网站上的数据更改为下周比赛,我需要它直到比赛结束后的第二天(星期六)才改变。我尝试添加 1 天

(wk, 1 +1d {fn NOW() })) 

但显然这不起作用。所以我肯定会感谢一些帮助。

4

4 回答 4

1
select
    _StartDate, _RescheduleDate, _GameTime, _FieldNumber, _Notes
from (
    select distinct
        _NewDate = coalesce(nullif(_RescheduleDate,'TBD'),_StartDate)
        ,_StartDate
        ,_RescheduleDate
        ,_GameTime
        ,_FieldNumber
        ,_Notes
        from _Schedule
    ) sch
where (_NewDate >= cast(getdate() as date))
    and (_NewDate < dateadd(wk, 1, getdate()))  

您的“游戏提前一天退出”问题是因为您正在将当前时间与日期进行比较 - 所以时间组件被假定为00:00:00.000. 这就是为什么您会看到建议不要将开始日期和开始时间存储在单独的列中。请注意,cast(getdate() as date)需要 SQL 2008 或更高版本;用于cast(floor(cast(getdate() as float)) as datetime)早期版本。

http://sqlfiddle.com/#!3/9d171/5/0

于 2013-06-03T15:21:49.427 回答
0

您能否向我们展示这样的设置所需的结果:

declare @_Schedule table (_StartDate datetime, _RescheduleDate datetime, _GameTime datetime, _FieldNumber int, _Notes varchar(10))
insert into @_Schedule
    select '2013-05-31', null,          '10:30:00', 1, '...' union all
    select '2013-06-02', '2013-06-03',  '10:30:00', 1, '...' union all
    select '2013-06-04', null,          '10:30:00', 1, '...' union all
    select '2013-06-05', null,          '10:30:00', 1, '...'


SELECT DISTINCT 
    _StartDate, _RescheduleDate, _GameTime, _FieldNumber, _Notes
FROM
    @_Schedule
WHERE
    (_StartDate >= DATEADD(wk, 0, getdate())) 
    AND (_StartDate < DATEADD(wk, 1, getdate()))
于 2013-05-31T19:46:18.977 回答
0

我有点希望它包含在当前的声明中。我知道有可能我只是不确定如何去做。日程页面需要显示所有要玩的游戏,包括定期安排的比赛和重新安排的比赛。

内森,我认为您正在做一些事情。为重新安排的比赛选择“数据格式”之类的结果。你知道如何创建复合选择语句吗?我试图在网上找到一个示例,但尚未找到适用的示例。

于 2013-06-02T10:29:29.367 回答
0

当您“检查” _RescheduleDate 值时需要发生什么?

如果您只想对重新安排的比赛进行另一个查询,以便可以在网站的单独页面或部分上进行查询,只需修改 WHERE 子句

SELECT DISTINCT 
  _StartDate, _RescheduleDate, _GameTime, _FieldNumber, _Notes
FROM
  _Schedule
WHERE
  (_StartDate >= DATEADD(wk, 0, { fn NOW() })) 
  AND (_StartDate < DATEADD(wk, 1, { fn NOW() }))
  AND _RescheduleDate IS NOT NULL
  AND _RescheduleDate <> 'TBD'

否则,CASE 语句将能够在选择值时“检查”该值。

SELECT DISTINCT 
    _StartDate
, CASE 
     WHEN _RescheduleDate IS NULL THEN ''
     WHEN _RescheduleDate = 'TBD' THEN '' 
     ELSE --do something with the valid datetime 
  END AS _RescheduleDate
, _GameTime, _FieldNumber, _Notes
于 2013-06-01T04:20:12.560 回答