如何按当前日期之后的日期过滤?
Posted
技术标签:
【中文标题】如何按当前日期之后的日期过滤?【英文标题】:how to filter by dates after the current date? 【发布时间】:2019-05-21 11:19:25 【问题描述】:我想按当前日期之后的日期过滤到期日期。问题是当前数据的日期分三列; exp0year
、exp0mo
和 exp0da
。
我尝试放置多个 where 子句,exp0mo > 4
的问题使日期不符合 1/1/2020
。
Select exp0yr,exp0mo,exp0da,policy0num,zip0post,add0line01,add0line03,add0line04,profit0ctr
from ni.pmsp0200
where exp0yr>118 and exp0mo>04 and exp0da>20 and profit0ctr='eoh'
group by exp0yr,exp0mo,exp0da,policy0num,zip0post,add0line01,add0line03,add0line04,profit0ctr
我希望得到05/21/2019
之后的日期,但我得到了除01/01/2020
-05/20/2020
之外的所有日期。
【问题讨论】:
这个答案应该可以帮助你***.com/questions/35576983/… How to create a Date in SQL Server given the Day, Month and Year as Integers的可能重复 我建议使用计算列来计算实际日期。如果你创建列PERSISTED
,你甚至可以索引它。如果您从逻辑上考虑,为什么会期望 2020 年 1 月至 4 月出现? 1、2、3 和 4 都小于或等于 4,并且您仅需要月份值大于 4 的行。
【参考方案1】:
如果你使用 sql server 2012+ 可以获取当前数据日期as follow
datefromparts(exp0yr, exp0mo, exp0da)
否则使用这样的东西:
SELECT CAST(CONCAT(CAST(@exp0yr AS VARCHAR(4)), '-',CAST(exp0mo AS VARCHAR(2)), '-',CAST(exp0daAS VARCHAR(2))) AS DATE)
你的脚本变成了这样
declare @mydate as date
set @mydate='2019/05/21' --Put your target date here
Select exp0yr,exp0mo,exp0da,policy0num,zip0post,add0line01,add0line03,add0line04,profit0ctr
from ni.pmsp0200
where datefromparts(exp0yr, exp0mo, exp0da)>@mydate and profit0ctr='eoh'
group by exp0yr,exp0mo,exp0da,policy0num,zip0post,add0line01,add0line03,add0line04,profit0ctr
【讨论】:
【参考方案2】:试试这个
--Temp table
CREATE TABLE #Test
(cYear VARCHAR(4) NOT NULL,
cMonth VARCHAR(2) NOT NULL ,
cDay VARCHAR(2) NOT NULL
);
--Sample data
INSERT INTO #Test
SELECT '2019',
'04',
'01'
UNION ALL
SELECT '2018',
'06',
'01';
--Calculated column - you can define prefix, such as leading zeros
ALTER TABLE #TEST
ADD calcDate AS CYEAR + CMONTH + CDAY PERSISTED
--Shows only one record
SELECT *
FROM #Test
WHERE calcDate BETWEEN '20190101' AND '20191231';
【讨论】:
以上是关于如何按当前日期之后的日期过滤?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用Java Streams API正确过滤开始日期和结束日期之间的日期?