2016-11-11 105 views
0

从某个表中获得记录的最佳脚本是createdDatemodifiedDate,其中modifiedDate是唯一可以为空的列,并且等于当前日期/当前日期?根据2个日期列选择记录

如果修改日期列中存在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()) 
+1

'convert(date,ModifiedDate)'...我不喜欢这样,因为它暗示着你在非日期类型中存储你的日期信息。 –

+0

我必须得到相同的日期的记录,我用转换(日期,日期时间)来删除时间,我也试图施放(ModifiedDate作为日期),我需要以最快的方式获取记录.. – jankenshin2004

+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())在predicats。引擎将无法应用现有索引。阅读关于sargableCAST(SomeDateTime AS DATE)是一个例外,它是可控的。

如果你不需要这个在任何日期(仅适用于今天),它应该足以说:这一行是今天创建或今天被修改。

重要确保有用于ModifiedDateCreatedDate指标!

+0

Hi @Shnugo,OR会影响我认为的表现,是的,这两列有索引 – jankenshin2004

+0

@ jankenshin2004你为什么这么认为?简单的布尔逻辑(AND/OR ...)是最快的。如果在两列上都有一个索引,那么即使有数百万行,检查等同性也应该是闪电般的...... – Shnugo

+0

根据我现在的经验,当我使用OR对比上面发布的脚本时,执行时间太过不同了。 – jankenshin2004

0

这是你在找什么?

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

我认为不,因为它会得到所有记录。上面的脚本没有过滤器..如果我使用它,它将返回数百万条记录。我只需要今天的记录 – jankenshin2004

+0

您能否向我们提供一些样本数据? – dhaninugraha

0

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

SELECT * FROM表 WHERE ISNULL(CONVERT(日期,ModifiedDate),CONVERT(日期,CreatedDate))= CONVERT(日期,GETDATE())

+0

请阅读已有的答案......在WHERE子句中使用'ISNULL()'不是* sargable *。引擎将无法应用索引。这是应该避免的... – Shnugo

+0

感谢您的信息。 COALESCE()函数怎么样?它是否也会打破索引的使用? –

+0

是的,几乎所有的函数都会使优化器失效。有几个例外,如'CAST(SomeDateTime AS DATE)',但在大多数情况下,该函数将导致*逐行*执行... – Shnugo

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()