【问题标题】:tsql selecting record based upon date and nulltsql 根据日期和空值选择记录
【发布时间】:2016-02-17 15:06:28
【问题描述】:

我有一张桌子:

ID as int, ParentId as int, FreeFromTerxt as varchar(max), ActiveUntil as DateTime

例如,在这个表中我有两条记录。

1, 100, 'Some text', '2015-11-30 12:10:09.0000000'
2, 100, 'New  text', null

我想要做的是获取当前的活动记录,在上面的例子中是记录 1。为此,我只需使用以下条件进行选择:

ActiveUntil > GETDATE()

这很好用,但是如果我将第一个日期更改为 2015-10-30,我需要获取空记录,因为此记录将优先。

所以我把代码改成了:

((ActiveUntil is NULL) OR (ActiveUntil > GETDATE()))

但这不起作用。

【问题讨论】:

  • 如果ParentID 未来没有ActiveUntil,您想将空记录作为备用记录吗?每个ParentId 只需要一个或全部?

标签: tsql date select


【解决方案1】:

这是union 的一些示例:

DECLARE @t TABLE ( d DATETIME )
INSERT  INTO @t
VALUES  ( NULL ),
        ( '2015-11-30' )

SELECT TOP 1 *
FROM    ( SELECT    * , 1 AS ordering
          FROM      @t
          WHERE     d > GETDATE()
          UNION ALL
          SELECT    * , 2 AS ordering
          FROM      @t
          WHERE     d IS NULL
        ) t
ORDER BY ordering, d

对于2015-11-30,它返回2015-11-30。对于2015-10-30,它返回null

【讨论】:

    【解决方案2】:

    试试这样:

    ((ActiveUntil is NULL) OR (CONVERT(char(10), ActiveUntil  ,126)) > GETDATE())
    

    请参阅 MSDN 以获取 Cast and Convert。格式说明符 126 用于 YYYY-MM-DD。或者你可以使用 CAST

    ((ActiveUntil is NULL) OR (CAST(ActiveUntil as Date) > GETDATE())
    

    【讨论】:

    • 你应该使用 ActiveUntil 而不是 getdate。并且更好地投射到日期,因为你正在投射到 varchar 然后再次约会
    • 这个问题是当2015-11-30 在表中时,它将返回 2 行。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-02
    • 1970-01-01
    • 1970-01-01
    • 2021-04-06
    • 1970-01-01
    • 1970-01-01
    • 2019-03-29
    相关资源
    最近更新 更多