SQL Server在给定日期之前获得第一个结果

SQL Server在给定日期之前获得第一个结果

问题描述:

我试图弄清楚如何编写此查询。SQL Server在给定日期之前获得第一个结果

start_date -> '2017-08-02 00:00:00.000' 
end_date -> '2017-08-03 00:00:00.000' 

我同时需要start_dateend_date之前的第一个日期值,并把它在查询中列出的表,在这些日期间(前原1个纪录,我解释)

这里是记录到目前为止,我已经试过:

SELECT 
    * 
FROM 
    table_cons 
WHERE 
    (SELECT TOP 1 
     fld_Id, fld_ConsStartDateTime 
    FROM table_cons 
    WHERE fld_ConsStartDateTime < N'2017-08-02 00:00:00.000' 
    ORDER BY fld_ConsStartDateTime DESC) 
    AND (SELECT TOP 1 
       fld_Id, fld_ConsEndDateTime 
      FROM table_cons 
      WHERE fld_ConsEndDateTime < N'2017-08-03 00:00:00.000' 
      ORDER BY fld_ConsEndDateTime DESC) 

错误:

An expression of non-boolean type specified in a context where a condition is expected, near ')'.

任何帮助appriciated。

UPDATE

  • 开始_ = '2017年8月2日00:00:000'
  • END_DATE = '2017年8月3日00:00:000'

通常我会做的是这样的:

SELECT * 
FROM table_cons 
WHERE fld_ConsStartDateTime > 'Start_date' 
    AND fld_ConsEndDateTime < 'End_date' 

但事实并非如此。我需要计算新的Start_dateEnd_date(比方说Start_date2End_date2)。如何计算这些新的日期?通过从DB第一日期时间读取前指定的日期)

像这样:

  • Start_date2 - > '2017年8月1日23:55:00.000'
  • End_date2 - >“2017-08 -02 23:55:00.000'
+0

你的意思是你需要1个一行日期起始日期前和1行与END_DATE之前的日期? –

+0

@RafalZiolkowski我在给定日期之前需要1条记录。例如 start_date = 2017-08-02 00:00.000,如果数据库中此日期之前的第一个日期是2017-08-01 23:59:00 000.,那么我需要该日期 – FreshPro

+0

它不是100%清楚想。你想拥有两个BOTH(startdate&enddate)都是给定日期的记录吗?或在两个给定日期之前(如你的帖子所示)?请添加示例数据以便向大家明确。 –

如果您需要3-5分钟计算新的日期时间,你可以这样做:

DATEADD(MINUTE, -5, '2017-08-02 00:00:000') 
DATEADD(MINUTE, -5, '2017-08-03 00:00:000') 

作为备注,您不能将查询作为条件,您可以将它放在的条件中。换句话说,你不能做到这一点:

SELECT 
    * 
FROM table_cons 
WHERE (SELECT TOP 1 
    fld_Id, 
    fld_ConsStartDateTime 
FROM table_cons 
WHERE fld_ConsStartDateTime < N'2017-08-02 00:00:00.000' 
ORDER BY fld_ConsStartDateTime DESC) 

,但你可以这样做:

SELECT 
    * 
FROM table_cons 
WHERE fld_ConsStartDateTime <= (SELECT TOP 1 
    fld_Id, 
    fld_ConsStartDateTime 
FROM table_cons 
WHERE fld_ConsStartDateTime < N'2017-08-02 00:00:00.000' 
ORDER BY fld_ConsStartDateTime DESC) 

但是这不会有任何意义,因为你可以直接将查询限制。

+0

请参阅updte部分。我试图更具体 – FreshPro

我明白你的问题像帽子:

您要选择的第一个条目(最新或最古老的?),这是您的数据范围之间。 然后结果将是例如每个10个条目到不同的时间戳。 所以我的理解。

您可以在数据范围上进行筛选,并将最新条目的min(日期)(如果它必须是最早的条目)或max(日期)作为子查询选中,并将其用于另一个查询以完全相等到最小(日期)/最大(日期)。 因此,也许类似的东西了,最早的条目

select * from table_cons where fld_ConsStartDateTime= 
    (
     select min(fld_ConsStartDateTime) FROM table_cons 
WHERE fld_ConsStartDateTime > 'Start_date' 
    AND fld_ConsEndDateTime < 'End_date' 
    ) 
and fld_ConsEndDateTime = 
    (
     select min(fld_ConsEndDateTime) FROM table_cons 
WHERE fld_ConsStartDateTime > 'Start_date' 
    AND fld_ConsEndDateTime < 'End_date' 
    )