我正在试图弄清楚如何编写此查询。
start_date -> '2017-08-02 00:00:00.000'
end_date -> '2017-08-03 00:00:00.000'
我需要start_date
和end_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)
错误:
在预期条件的上下文中指定的非布尔类型的表达式,在')'附近。
任何帮助都是适当的。
更新
通常我会做的是:
SELECT *
FROM table_cons
WHERE fld_ConsStartDateTime > 'Start_date'
AND fld_ConsEndDateTime < 'End_date'
但事实并非如此。我需要计算新的Start_date
和End_date
(让我们说Start_date2
和End_date2
)。如何计算这些新日期?通过从db获取给定日期之前的第一个日期时间
像这样:
答案 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'
)