SQL Server在给定日期之前获得第一个结果
我试图弄清楚如何编写此查询。SQL Server在给定日期之前获得第一个结果
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)
错误:
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_date
和End_date
(比方说Start_date2
和End_date2
)。如何计算这些新的日期?通过从DB第一日期时间读取前指定的日期)
像这样:
- Start_date2 - > '2017年8月1日23:55:00.000'
- End_date2 - >“2017-08 -02 23:55:00.000'
如果您需要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)
但是这不会有任何意义,因为你可以直接将查询限制。
请参阅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'
)
你的意思是你需要1个一行日期起始日期前和1行与END_DATE之前的日期? –
@RafalZiolkowski我在给定日期之前需要1条记录。例如 start_date = 2017-08-02 00:00.000,如果数据库中此日期之前的第一个日期是2017-08-01 23:59:00 000.,那么我需要该日期 – FreshPro
它不是100%清楚想。你想拥有两个BOTH(startdate&enddate)都是给定日期的记录吗?或在两个给定日期之前(如你的帖子所示)?请添加示例数据以便向大家明确。 –