SQL Server在给定日期

时间:2017-08-03 08:43:09

标签: sql 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)

错误:

  

在预期条件的上下文中指定的非布尔类型的表达式,在')'附近。

任何帮助都是适当的。

更新

  • Start_date ='2017-08-02 00:00:000'
  • End_date ='2017-08-03 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 - &gt; '2017-08-01 23:55:00.000'
  • End_date2 - &gt; '2017-08-02 23:55:00.000'

2 个答案:

答案 0 :(得分:0)

如果你需要用-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)

然而,这没有任何意义,因为您可以直接限制查询。

答案 1 :(得分:0)

我理解你的问题,比如帽子:

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

您可以过滤数据范围,并选择最新条目的min(日期)(如果必须是最旧的条目)或max(date)作为子查询,并将其用于另一个查询以过滤精确的相等性最小(日期)/最大(日期)。 对于最古老的条目,也许是类似的东西

    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'
    )