比较SQL Server 2005中DateTime数据类型的时间部分

时间:2010-01-04 17:14:02

标签: sql-server sql-server-2005

如何仅比较SQL Server 2005中DateTime数据类型的时间部分?例如,我想获取MyDateField在特定时间之后的所有记录。以下示例是一个非常长且可能不快的方法。 我想要MyDateField大于12:30:50.400的所有日期

SELECT *
FROM   Table1
WHERE      ((DATEPART(hour, MyDateField) = 12) AND (DATEPART(minute, MyDateField) = 30) AND (DATEPART(second, MyDateField) = 50) AND (DATEPART(millisecond, MyDateField) > 400))
        OR ((DATEPART(hour, MyDateField) = 12) AND (DATEPART(minute, MyDateField) = 30) AND (DATEPART(second, MyDateField) > 50))
        OR ((DATEPART(hour, MyDateField) = 12) AND (DATEPART(minute, MyDateField) > 30))
        OR ((DATEPART(hour, MyDateField) > 12))

6 个答案:

答案 0 :(得分:13)

SELECT *
FROM Table1
WHERE DATEADD(day, -DATEDIFF(day, 0, MyDateField), MyDateField) > '12:30:50.400'

答案 1 :(得分:5)

这个怎么样?

SELECT (fields)
FROM dbo.YourTable
WHERE DATEPART(HOUR, MyDate) >= 12
  AND DATEPART(MINUTE, MyDate) >= 23
  AND DATEPART(SECOND, MyDate) >= 45

小时以24小时格式给出,例如12表示中午12点,15表示下午3点。

DATEPART也有分数,秒等的“部分”。当然,您可以根据需要在WHERE子句中使用尽可能多的日期部分。

答案 2 :(得分:1)

我想要做的是提取DateTime数据类型的时间部分,并进行比较。我找到了一种在StackOverflow中提取日期部分的方法。如果我只有日期部分,它只是从源DateTime中减去日期:

datePortion = DATEADD(day,DATEDIFF(day,0, sourceDate ),0)
timePortion = DATEDIFF(毫秒,datePortion, sourceDate

所以在SQL Server 2005中提取时间部分的宏是:

f(x)= DATEDIFF(毫秒,DATEADD(日,DATEDIFF(日,0, sourceDate ),0), sourceDate

现在,将DateTime字段的时间部分与12:30:50.400进行比较的查询是:

SELECT *
FROM   Table1
WHERE
        DATEDIFF(millisecond, DATEADD(day, DATEDIFF(day, 0, DateTimeField), 0), DateTimeField)
        >
        DATEDIFF(millisecond, DATEADD(day, DATEDIFF(day, 0, '1900-01-01T12:30:50.400'), 0), '1900-01-01T12:30:50.400')

我已针对其他类型的查询测试了此查询,包括使用减法运算符(' - ')和CONVERT。执行计划比较表明这是执行此操作的最快方法。我还测试了查询执行的实际时间......没有明显的最快方法。

答案 3 :(得分:1)

其他人已经发布了形成查询的替代方法,但我想回答你在第一段中说的话:

  

以下示例是一种非常长且可能不是快速的方法。

在性能方面,如果你有一个DATEPART或10 DATEPARTS并不重要;你甚至有一个DATEPART的事实会影响你的表现。

如果您需要按时间而不是按日期进行比较,那么Lasse的评论是正确的 - 您需要将其标准化为单独的日期/时间列。实际上,SQL 2008引入了datetime类型,并建议您使用它们而不是datetime。你没有在SQL 2005中使用它,但是你可以使用例如时间的刻度字段和强制日期列的所有日期部分为零的检查约束来解决它。

如果您以后需要在完整日期+时间执行过滤器,则很容易创建计算列,如果性能是那些问题,您可以保留该列并在其上创建索引。

答案 4 :(得分:0)

以下是将日期与时间匹配的SQL:

仅匹配时间:

AND CAST(RIGHT(CONVERT(VARCHAR, YOURDATE, 100), 7) as time) >
CAST(RIGHT(CONVERT(VARCHAR, GETDATE(), 100), 7) as time)

将日期与时间匹配:

CAST(YOURDATE AS DATE)=CAST(GETDATE() AS DATE)
AND CAST(RIGHT(CONVERT(VARCHAR, YOURDATE, 100), 7) as time) >
CAST(RIGHT(CONVERT(VARCHAR, GETDATE(), 100), 7) as time)

答案 5 :(得分:-1)

convert(varchar(10),MyDate,108)

这为您提供格式为HH:MM:SS的时间字符串。

然后你可以用它进行任何比较