根据2个日期列选择记录

时间:2016-11-11 07:34:01

标签: sql-server sql-server-2008 tsql

使用列createdDatemodifiedDate从某个表中获取记录的最佳脚本是什么?其中modifiedDate是唯一可为空的列,并且等于现在的日期/当前日期?

如果修改日期列中有null个值,脚本将获得创建日期。

输出应获取包含最新创建或修改数据的所有记录。我在下面尝试了这些脚本:

SELECT *
FROM table
WHERE ISNULL(CONVERT(date, ModifiedDate),
             CONVERT(date,CreatedDate)) = CONVERT(date, getdate())

SELECT *
FROM table
WHERE CASE WHEN ModifiedDate IS NULL
           THEN CONVERT(date, CreatedDate)
           ELSE CONVERT(date,ModifiedDate) END = CONVERT(date, getdate())

4 个答案:

答案 0 :(得分:1)

如果您只需要针对今天(= GETDATE()),这应该很简单:

SELECT *
FROM tbl
WHERE  CAST(CreatedDate AS DATE) = CAST(GETDATE() AS DATE)
    OR (ModifiedDate IS NOT NULL AND CAST(ModifiedDate AS DATE)= CAST(GETDATE() AS DATE));

一些想法:在谓词中使用函数(这里:ISNULL())是非常糟糕的。引擎将无法应用现有索引。阅读 sargable 。一个例外是CAST(SomeDateTime AS DATE)这是可以理解的。

如果您对任何日期(仅适用于今天)不需要此项,则应该足够说:此行今天已创建或今天已修改。

重要请确保有ModifiedDateCreatedDate的索引!

答案 1 :(得分:0)

这是你在找什么?

SELECT
   someColumn1,
   someColumn2,
   CASE
       WHEN modifiedDate IS NULL THEN createdDate
       ELSE modifiedDate
   END AS someDate
FROM someTable

答案 2 :(得分:0)

您可以在TSQL中使用ISNULL()函数

SELECT *     从表     哪里     ISNULL(CONVERT(date,ModifiedDate),CONVERT(date,CreatedDate))= CONVERT(date,getdate())

答案 3 :(得分:0)

如果使用函数会影响索引,请尝试使用此函数。

SELECT *
FROM table
WHERE ModifiedDate IS NOT NULL
AND CONVERT(date,ModifiedDate) = CONVERT(date, getdate()
UNION 
SELECT *
FROM table
WHERE ModifiedDate IS NULL
AND CONVERT(date,CreatedDate) = CONVERT(date, getdate()
相关问题