使用SQL比较日期

时间:2014-10-01 11:34:46

标签: sql sql-server-2008

我的日期如下:2014-10-01 12:35:29.440

表格如下:

ORDER 1 | 2014-07-31 00:00:00.000

ORDER 2 | 2015-07-31 00:00:00.000

抱歉,我希望ORDER 2出现..因为我的获取日期返回今天的日期,并且大于2014-07-31 00:00:00.000

以下是我的尝试:

SELECT TOP 1 NAME
FROM ORDER_DATES
WHERE GETDATE() > ORDER_DATE
ORDER BY NAME DESC

4 个答案:

答案 0 :(得分:1)

你的问题仍然没有以一种有利于你所需要的方式措辞......但我想我现在根据评论理解你想要的东西。

基于评论:

  

如果它与日期不匹配则需要返回下一行。   这是ORDER 2

这样的事情应该有效:

SELECT TOP 1 name
FROM ORDER_DATES o
INNER JOIN (
    -- This subquery finds the first date that occurs *after* the current date
    SELECT MIN(ORDER_DATE) AS ORDER_DATE
    FROM ORDER_DATES
    WHERE ORDER_DATE > GETDATE()
) minDateAfterToday ON o.ORDER_DATE = minDateAfterToday.ORDER_DATE
ORDER BY name

如果您在表格中有一个ID字段,这会更好用,但是这个 应该使用给定的数据,如果你有两个订单,你可能会遇到问题完全相同的日期。

编辑:

这是一个显示查询实际效果的小提琴:

http://sqlfiddle.com/#!6/f3057/1

答案 1 :(得分:0)

DATEDIFF会派上用场,您也必须按ORDER_DATE订购:

SELECT TOP 1 NAME
FROM ORDER_DATES
WHERE DATEDIFF(DAY,ORDER_DATE,GETDATE())>0
ORDER BY  ORDER_DATE DESC

答案 2 :(得分:0)

检查您是否正在查询右表

declare @dt datetime  = cast('2014-10-01 12:35:29.440' as datetime), @dt2  datetime= cast('2014-07-31 00:00:00.000' as datetime);

print(case when @dt > @dt2 then 1 else 0 end); 

这段脚本显示输出1,即条件应与ORDER 1匹配。

验证您是否遗漏了某些东西。


根据原始问题的更改

修改

此处需要恢复条件,因为日期值将来会大于当前日期

新查询将为

SELECT TOP 1 NAME
FROM ORDER_DATES
WHERE  ORDER_DATE > GETDATE()
ORDER BY NAME DESC

答案 3 :(得分:0)

你可以写成:

SELECT NAME
FROM ORDER_DATES
WHERE cast(GETDATE()as date) > cast (ORDER_DATE as date)
ORDER BY NAME DESC

Demo