2011-07-29 68 views
3

我有一个问题。我有一个带有字段列的SQL Server 2008表。我有例如日期如下:SQL日期问题

1/1/2001 
5/5/2004 
8/5/2009 
10/7/2011 
5/5/2012 
1/13/2014 

我还想能够显示所有日期> =当前日期(7/29/2011),以及是<当前日期最大的表日期。在这个例子中,结果将是所有日期>= 8/5/2009

有人可以帮助指导我吗?

+0

我编辑了描述以更好地描述我相信他正在寻找的东西。 –

+0

请您澄清要求吗?当你说“当前日期的日期”时,你的意思是“昨天”吗?或者你的意思是,“表中最近的日期是<=今天?” –

+1

除了您使用的RDBMS(例如SQL Server)之外,您可以指定哪个版本?数据类型是date/datetime/smalldatetime还是以char/varchar存储?你能以表格的形式展示你的预期结果,而不是在一个单词问题上? –

回答

3

如果我理解正确,您希望包含当前日期之前的日期。 GETDATE()将获得当前日期(随着时间)。如果你没有问题,那么这应该工作。否则,你可能要解析出刚刚从GETDATE()

SELECT TheDate 
FROM DateTable 
WHERE TheDate >= (SELECT MAX(TheDate) FROM DateTable WHERE TheDate < GETDATE()) 

日期此获取当前日期之前大于或等于最近日期的所有日期。

+0

是的,这与OP似乎想要的很接近。 –

0

我不完全确定我的理解,但这看起来像是相关日期之间的差异。还是有更多我失踪?

+0

我想他只想查询紧接在当前日期之前的日期,以及当前日期之后的每个日期。 –

0

假设你的表称为DateTable和你的场TheDate叫,像这样做:

SELECT TheDate 
FROM DateTable 
WHERE TheDate >= DATEADD(d, -2, GETDATE()) 

祝你好运!

+0

我相信他希望在当前日期之前的第一个入口,不一定是前一天(所以他希望8/5/09返回,这不会在您的查询中) –

+0

啊,有趣的。 –

4
select max(date) [date] from table where date < getdate() 
union 
select date from table where date >= getdate() 
+0

这会工作,但似乎没有工会的解决方案可能会更好。 – Narnian

+0

但是,嵌套选择比联盟更好吗? – dizzwave

0

它取决于您正在使用的SQL服务器。在Postgres的,例如,你需要像

SELECT fields FROM table WHERE date_field >= CURRENT_DATE - 1 

但其他SQL服务器有不同的方式来指定 “昨天”

0
SELECT d1.* 
FROM dates d1 
    LEFT JOIN dates d2 ON d1.Date < d2.Date AND d2.Date < GETDATE() 
WHERE d2.Date IS NULL 

说明:

选择每个日期为其中有不存在比今天早和晚于正在检查的日期的日期。

0

很多基于松散叙述和未知数据类型的猜测。

DECLARE @t TABLE(d DATE); 

INSERT @t SELECT '20010101' 
UNION ALL SELECT '20040505' 
UNION ALL SELECT '20090805' 
UNION ALL SELECT '20111007' 
UNION ALL SELECT '20120505' 
UNION ALL SELECT '20140113'; 

DECLARE @now DATE = SYSDATETIME(); 

WITH t AS 
(
    SELECT d, rn = ROW_NUMBER() OVER (ORDER BY d) 
    FROM @t 
) 
SELECT t.d 
    FROM t LEFT OUTER JOIN t AS x 
    ON t.rn = x.rn - 1 
    WHERE COALESCE(x.d, @now) >= @now 
    ORDER BY t.d;