Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 比较SQL Server 2005中日期时间数据类型的时间部分_Sql Server_Sql Server 2005 - Fatal编程技术网

Sql server 比较SQL Server 2005中日期时间数据类型的时间部分

Sql server 比较SQL Server 2005中日期时间数据类型的时间部分,sql-server,sql-server-2005,Sql Server,Sql Server 2005,如何在SQLServer2005中仅比较日期时间数据类型的时间部分?例如,我想获取MyDateField在特定时间之后的所有记录。下面的示例是一个很长的方法,可能不是很快。 我想要MyDateField大于12:30:50.400的所有日期 SELECT * FROM Table1 WHERE ((DATEPART(hour, MyDateField) = 12) AND (DATEPART(minute, MyDateField) = 30) AND (DATEPART(seco

如何在SQLServer2005中仅比较日期时间数据类型的时间部分?例如,我想获取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))
这个怎么样

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子句中使用任意数量的日期部分。

convert(varchar(10),MyDate,108)

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


然后可以对它进行任何比较

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

DatePartion=DATEADD(天,DATEDIFF(天,0,sourceDate),0)
timepartion=DATEDIFF(毫秒,datepartion,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')

我已将此查询与其他类型的查询进行了测试,包括使用减法运算符('-')和转换。执行计划比较表明,这是实现这一点的最快方法。我还测试了查询执行的真实时间。。。没有明显的最快方法。

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

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

就性能而言,如果您有一个
DATEPART
或10个
DATEPARTS
,这其实并不重要;事实上,您甚至有一个
DATEPART
,这将影响性能

如果你需要比较时间而不是日期,那么Lasse的评论是正确的——你需要规范化为单独的日期/时间列。实际上,SQL2008引入了
date
time
类型,并建议您使用它们而不是
datetime
。在SQL2005中没有这个功能,但是可以使用一个时间刻度字段和一个强制日期列的所有日期部分为零的检查约束来解决这个问题


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

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

SELECT *
FROM Table1
WHERE DATEADD(day, -DATEDIFF(day, 0, MyDateField), MyDateField) > '12:30:50.400'
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)
要仅匹配时间,请执行以下操作:

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)

如果中午是截止,那么逻辑应该是<代码>小时>=12 < /代码>或可能<代码>小时> 12或(小时=12和毫秒>0)< /代码>。但我也要考虑时间部分的其他部分,而不仅仅是小时。我已经测试过了,但是它没有得到记录,时间是13:00:0,用ORs代替ANDs也不能解决问题。唯一的解决方案是and和OR的组合,但这会使查询变得很长…@Miguel:你能告诉我们你使用的查询吗??用额外的信息更新你的原始问题我认为这行不通。该查询将匹配下午12:30:48,但不匹配下午2:00:00,因为分钟部分与条件不匹配。太糟糕了,您没有在SQL'05中获得时间类型…时间部分还包含毫秒。。。是否有一种格式也可以返回全职部分?我要寻找的是一种排除日期部分的方法,只留下时间。请注意,如果您实际上需要单独处理日期和时间,那么实际上您违反了规范化规则。DateTime值是日期上的特定时间点。日期和时间是一个多值字段,应该将其拆分。您的代码运行缓慢的原因是您没有正确地规范化它。@Lasse-您将对此采取何种措施?当然,您不会在单独的字段中存储:日、月、年、小时、分钟、工作日、周末、季度、周,而只是存储日期。@Lasse-当然,我可以在日期和时间字段中分离日期时间字段。但是,如果同时比较日期和时间,我也会遇到同样的问题。@Miguel:你可以很容易地用一个计算列来处理这个比较,如果需要的话,你可以将计算列持久化并为性能建立索引。因此我同意拉塞的观点。你完全正确!=)我问这个问题,因为我想知道如何解决它,它的方式是,不改变数据库。事实上,所有的查询解决方案都是相同的速度顺序,所有的速度都会很慢。。。我现在就测试过了。。。但是使用DATEADD和DATEDIFF是最差的方法中最好的。为了整理查询,而不是提高性能,如果将其放入UDF中,这是一个非常好的解决方案。这样你就可以把它写成
WHERE dbo.GetTime(MyDateField)>=@someone
。一开始我想知道,如果只更改查询,是否可以获得更高的性能。这是可能的,但不是太多,低于2%。我找不到GetTime函数。我认为这是目前为止最好的解决方案。它清晰易懂。此外,它是仅针对查询而非数据库结构的最快解决方案。