在SQL Server 2008中比较时间

3

这里有一张表格。我需要一个查询来返回指定时间的班次id。
我该如何获取这个值?

shift_ID   shift_From                shift_To
1          2010-09-21 10:00:00.000   2010-09-21 18:10:00.000
2          2010-09-21 20:00:00.000   2010-09-21 05:00:00.000

假设我输入的是02:00:00,我需要得到班次ID为1。我该怎么做?

同一时间可能会有不同日期的班次,您需要全部显示吗? - anivas
@anivsa 这里提到的日期并不重要。该表中只会有两个条目。 - kbvishnu
1个回答

3

尝试:

SELECT shift_ID
FROM time_shift
WHERE
DATEDIFF(hour, shift_From, shift_To) = 2 -- your input

了解更多关于MSDN上的DATEDIFF

第一个参数是您要指定给DATEDIFF的时间部分(小时,分钟,秒)。

如果您的输入严格类似于02:00:00,则需要解析它以确定将其指定为第一个参数。


要确定指定的日期是否属于其他两个日期之间,请使用:

SELECT shift_ID
FROM time_shift
WHERE
    CAST(shift_From AS TIME) < CAST(@input AS TIME)
AND
    CAST(@input AS TIME) < CAST(shift_To AS TIME)
-- you can specify operators inclusiveness, i.e. <= >= etc
-- or
CAST(@input AS TIME) BETWEEN (CAST(shift_From AS TIME), CAST(shift_To AS TIME))

了解有关MSDN上的时间的更多信息。


我需要检查输入时间是否在班次开始和结束之间。DateDiff将返回班次的持续时间。 - kbvishnu
@abatishchev 在这里,我想比较不考虑日期的时间。你的查询没有返回任何结果 :( - kbvishnu
我需要指定哪种类型的输入?我尝试了这种方式: Declare @input time='02:00:00' SELECT shift_ID FROM tblEmpShift WHERE CAST(shift_From AS TIME) < CAST(@input AS TIME) AND CAST(@input AS TIME) < CAST(shift_To AS TIME) 但它不会返回任何东西。 - kbvishnu
@Hari:BETWEENTIME 上的表现很奇怪:SELECT CASE WHEN CAST('02:00:00' AS TIME) BETWEEN CAST('10:00:00.000' AS TIME) AND CAST('18:10:00.000' AS TIME) THEN 1 ELSE 0 END 返回 0。 - abatishchev
@Hari:我进行了一些调查,这是结果:02:00:00(凌晨2点)不在上午10点到下午6点之间是可以的,因为它确实不在之间:) 所以你不应该使用BETWEEN。我认为你应该使用DATEDIFF - abatishchev
终于我得到了答案 select es.shift_ID from tblEmpShift es where @time BETWEEN Convert(TIME,es.shift_From) AND CONVERT(Time,es.shift_To) - kbvishnu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接