sql查询开始时间和结束时间之间的数据?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sql查询开始时间和结束时间之间的数据?相关的知识,希望对你有一定的参考价值。

select * from where startTime>'datetime' and entTime<'datetime'这样查不出来

不是一个字段是2个字段 不要用between

如果不是1个字段,是2个字段的话,比如说一个是TimeA字段,一个是TimeB字段。
那就考虑用select * from 表 where TimeA>'时间1' and TimeB<'时间2'。
参考技术A 你的大于小于号错了吧,写反了。怎么能查询的时间比开始时间早,比结束时间晚呢?哪有这样的时间。
应该是:select * from where startTime<'datetime' and entTime>'datetime' 这样吧
参考技术B declare @datetime1 varchar(10),@datetime2 varchar(10);
set @datetime1=convert(char(10),getdate(),120) --显示结束时间,格式:2013-05-26
set @datetime2=left(@datetime1,8)+'01' --显示开始时间,格式:2013-05-01

select * from #table_1 where startTime>@datetime2 and entTime<@datetime1

--供参考。本回答被提问者和网友采纳
参考技术C 肯定查不出来啊,你datetime 是什么啊!

SQL Server 2008 仅在月份和年份之间选择数据

【中文标题】SQL Server 2008 仅在月份和年份之间选择数据【英文标题】:SQL Server 2008 select data only between month and year 【发布时间】:2011-10-27 14:16:05 【问题描述】:

我想选择两个日期之间的数据,没有日期

输入示例:

开始月份:9,开始年份:2011 结束月份:3,结束年份:2012

我认为有两种方法可以做到这一点。

第一个是将开始月份和开始年份转换为日期,如2011-09-01 并将最后日期转换为2012-03-31,但这需要计算结束月份的最后一天。获得这些日期后,我们可以对 WHERE 子句使用 BEETWEN 函数(但是,CONVERT 函数可靠吗?)

第二种解决方案是使用DATEPART 函数,如下代码所示:

我试着解释一下:如果结束年份等于初始年份,那么月份必须在开始月份和结束月份之间;否则,如果最后几个月大于最初几年,如果与最初和最后一年不同,我会采取介于两者之间的一切;否则,如果是最后一年,月份必须小于或等于最后一个月,如果是初始年份,月份必须大于或等于最后一个月

你能帮我以最好的方式做到这一点吗?对吗,我采用的方案?

declare @IndDebitoCredito bit,@ProgTributo int,@mi as integer,@ai as integer,@mf as integer,@af as integer,@IDAnagrafica varchar(5)
select @mi = 01,@ai = 2011,@mf = 12,@af = 2011,@IDAnagrafica = 'DELEL',@IndDebitoCredito = 1
select distinct rrd.IDTributo
    from TBWH_Delega d
    --inner join TBWH_SezioneDelega sd on d.IDDelega = sd.IDDelega
    inner join TBWH_Rigo rd on rd.IDDelega = d.IDDelega
    inner join TBWH_RataRigo rrd on rrd.IDRigo = rd.IDRigo 
    where
    (
        DATEPART(MM,d.DataDelega)<=@mf and 
        DATEPART(MM,d.DataDelega)>=@mi and 
        DATEPART(YYYY,d.DataDelega)=@ai and 
        @af = @ai
    ) 
    OR
    (
        --anno finale magg. anno iniziale
        @af > @ai AND
        ( 
            (   -- delega nell'intervallo
                DATEPART(YYYY,d.DataDelega)<@af AND 
                DATEPART(YYYY,d.DataDelega)>@ai
                -- DATEPART(MM,d.DataDelega)>=@mi 
            )
            OR
            (   -- delega limite destro
                DATEPART(YYYY,d.DataDelega)=@af AND 
                DATEPART(MM,d.DataDelega)<=@mf 
            )
            OR
            (   -- delega limite sinistro
                DATEPART(YYYY,d.DataDelega)=@ai AND 
                DATEPART(MM,d.DataDelega)>=@mi 
            )
        )
    )

【问题讨论】:

起初,我以为最后的 GO 是为我们准备的:“问题来了。现在.. GO!” :) 【参考方案1】:

您的第一个解决方案即将完成,但比它需要的要复杂得多,而且无论如何都行不通。它将错过从月底的最后一天开始的所有行。

您可以将一个月添加到end month,然后在每个月的第一天使用 BETWEEN。例如。

start month: 9 , start year: 2011 end month: 3, end year: 2012

BETWEEN '2011-09-01' AND '2012-04-01'

或者,正如 JNK 指出的那样,这样会更好:

DataDelega &gt;= '2011-09-01' AND DataDelega &lt; '2012-04-01'

您需要添加一些逻辑来处理 end month 是 12 月,但这看起来是最简单的方法。

【讨论】:

除了BETWEEN 包含在内,因此这将包括4/1/2012 你是对的 - 它将包括来自 '2012-04-01 00:00:000' 的任何行。没有看到有问题的数据,我不知道这是否是一个问题。 他在问题中说他只想包含截至上个月月底的数据。【参考方案2】:

WAY 过于复杂了。你真的只需要两个比较:

月份和年份是否在初始值之后或等于初始值? 月份和年份是否在最终值之前或等于最终值?

试试:

SELECT *
FROM MyTable
WHERE Datefield BETWEEN 
     CAST(@mi as varchar) + '/1/' + CAST(@ai as varchar) 
     -- first of first month
     AND
     DATEADD(DAY, -1, (DATEADD(Month, + 1, (CAST(@mf as varchar) + '/1/' + CAST(@af as varchar))))) 
     -- Last day or final month

【讨论】:

我建议使用 ISO-8601 标准日期格式:YYYYMMDD,因为这与 SQL Server 中的任何语言/区域设置无关 - 在我的服务器上,10/1/2011 将被解释为 10th例如,2011 年 1 月的...... @marc_s - 好点,这将是特定区域的书面 由于区域设置,我无法对此进行测试,但它会包含上个月最后一天的行吗?是的,如果 DateField 是日期而不是日期时间。或者,如果时间部分始终设置为午夜。【参考方案3】:
SELECT *
  FROM Table
 WHERE DateField
       BETWEEN CONVERT(DATE, CONVERT(CHAR(4), @ai) + RIGHT('00' + CONVERT(VARCHAR(2), @mi), 2) + '01', 112)
           AND DATEADD(DD, -1, DATEADD(MM, 1, CONVERT(DATE, CONVERT(CHAR(4), @af) + RIGHT('00' + CONVERT(VARCHAR(2), @mf), 2) + '01', 112)))

避免在 DateField 列上使用表达式,因为它使查询不是SARGable。

【讨论】:

【参考方案4】:

我会使用:

WHERE DateToCheck >=               --- first day of StartMonth
          DATEADD( mm, @StartMonth-1,
                   DATEADD( yy, @StartYear-2000, '2000-01-01') 
                 )
  AND DateToCheck <                --- first day of next month (after EndMonth)
          DATEADD( mm, @EndMonth,
                   DATEADD( yy, @EndYear-2000, '2000-01-01') 
                 )

【讨论】:

【参考方案5】:
DECLARE @mi INT
  , @ai INT
  , @mf INT
  , @af INT
SELECT  @mi = 01
      , @ai = 2011
      , @mf = 12
      , @af = 2011

--local variables to hold dates
DECLARE @i DATETIME
  , @f DATETIME

--build strings to represent dates in YYYYMMDD format
--add a month to the @f date
SELECT  @i = CONVERT(VARCHAR(4), @ai) + RIGHT('0' + CONVERT(VARCHAR(2), @mi),
                                              2) + '01'
      , @f = DATEADD(month, 1,
                     CONVERT(VARCHAR(4), @af) + RIGHT('0'
                                                      + CONVERT(VARCHAR(2), @mf),
                                                      2) + '01')

--select data where date >= @i, and < @f
SELECT  *
FROM    MyTable
WHERE   DateField >= @i
        AND DateField < @f 

【讨论】:

以上是关于sql查询开始时间和结束时间之间的数据?的主要内容,如果未能解决你的问题,请参考以下文章

sql查询问题,想找出开始时间和结束时间

sql语句 时间段查询 高分

SQL查询仅获取事件的开始和结束时间

SQL 'overlaps' 仅获取开始和结束之间的日期(不包括开始和结束日期)

mysql分片,表关联查询的sql怎么写

SQL 查询开始和结束日期