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-查询日期范围中的aribitrary时间间隔_Sql Server_Sql Server 2005_Tsql - Fatal编程技术网

Sql server SQL server 2005-查询日期范围中的aribitrary时间间隔

Sql server SQL server 2005-查询日期范围中的aribitrary时间间隔,sql-server,sql-server-2005,tsql,Sql Server,Sql Server 2005,Tsql,我有一个DateTime专栏。我想提取特定日期范围内8:30到16:15的所有记录。我的问题是,我需要将小时和分钟作为单个时间值进行比较。我可以测试DATEPART是否大于或小于某个小时值,但如果我在几分钟内测试DATEPART,那么如果当天晚些时候的分钟值较小,我的查询将失败 我已经查看了INTERVAL、BETWEEN、DATEPART、DATEDIFF等,但是如果没有可以跨不同日期的记录使用的“TimeOfDay”值,就看不到如何实现这一点 我曾尝试减去日期的年、月和日部分,以便仅比较一天

我有一个DateTime专栏。我想提取特定日期范围内8:30到16:15的所有记录。我的问题是,我需要将小时和分钟作为单个时间值进行比较。我可以测试DATEPART是否大于或小于某个小时值,但如果我在几分钟内测试DATEPART,那么如果当天晚些时候的分钟值较小,我的查询将失败

我已经查看了INTERVAL、BETWEEN、DATEPART、DATEDIFF等,但是如果没有可以跨不同日期的记录使用的“TimeOfDay”值,就看不到如何实现这一点

我曾尝试减去日期的年、月和日部分,以便仅比较一天中的时间,但当尝试分包时,例如,日期的年部分,我会得到一个错误:

这部分工作:

select - cast( DATEPART(YEAR, CallTime) as integer) from history
这失败了:

select DATEADD(YEAR, - cast( DATEPART(YEAR, CallTime) as integer), CallTime) 
from history where calltime is not null
我还尝试将小时和分钟部分转换为字符,连接它们并与我的目标范围进行比较,但这也失败了

我相信较新版本的SQL server可能具有处理这种情况的功能,但我不具备这种功能

我希望并想象有一个简单的、显而易见的解决办法,但我一直在逃避。

试一试:

DECLARE @StartDateTime  datetime
       ,@EndDateTime    datetime

--date range is ALL of January 1st up to & including 31st
SELECT @StartDateTime='2011/01/01'
      ,@EndDateTime='2011/01/31'

SELECT
    *
    FROM TableName  t
    WHERE 
        t.ColumnDate>=@StartDateTime AND t.ColumnDate<@EndDateTime+1 --date range
        AND LEFT(RIGHT(CONVERT(char(19),t.ColumnDate(),120),8),5)>='08:30' --time range start
        AND LEFT(RIGHT(CONVERT(char(19),t.ColumnDate(),120),8),5)<='16:15' --time range end
DECLARE@StartDateTime日期时间
,@EndDateTime日期时间
--日期范围为1月1日至31日(含31日)
选择@StartDateTime='2011/01/01'
,@EndDateTime='2011/01/31'
挑选
*
从表名t
哪里
t、 ColumnDate>=@StartDateTime和t.ColumnDate='08:30'--时间范围开始

左(右(CONVERT(char(19),t.ColumnDate(),120),8),5)DATETIME值可以转换为FLOAT。实际上,日期时间是以浮点形式存储的

浮动的全部部分是自“1899年12月31日”(或接近的日期)以来的天数。小数部分是小时数除以24。因此,0.5=中午12点

08:30是0.35416667

16:15是0.6770833333

选择CAST(CAST('2011-03-25 08:30:00'作为日期时间)作为FLOAT)=40625.35416667

选择CAST(CAST('2011-03-25 16:15:00'作为日期时间)作为FLOAT)=40625.6770833333

这样你就可以写作了

从雇用日期<40625.3541666667的用户中选择*

使用DATETIME作为浮点值,您可以使用最适合查询的数学函数。

尝试创建一个“MinuteOfDay”函数,根据DATETIME计算一天中经过的分钟数

CREATE FUNCTION dbo.[MinuteOfDay] 
(
    @dt datetime
)
RETURNS int
AS
BEGIN
    RETURN (datepart(hh,@dt)*60) + datepart(mi,@dt) 
END
然后使用该函数的结果进行过滤

select * 
from MyTable t 
where dbo.MinuteOfDay(t.SomeDateTimeColumn) between dbo.MinuteOfDay('1900-1-1 08:30:00') and dbo.MinuteOfDay('1900-1-1 16:15:00')

DATETIME
不存储为浮点数。它存储为2个整数,一个是日期,另一个是时间。我认为在这里使用float毫无意义。由于浮点舍入问题,它可能会添加不正确的结果。顺便说一句:要查看这一点,您可以使用
选择DATEADD(第二个,CAST(子字符串(CAST(GETDATE()为二进制(8)),5,4)为INT)/300.00,0)
谢谢您!这很好地发挥了作用。在我的进程中,我遇到的困难是,我一直在尝试在查询本身中执行所有操作,而不是创建函数。