关于IF/CASE语句的实现需求:跨年份按日期区间标记Y/N
日期区间标记解决方案
核心思路是剥离日期的年份信息,统一将所有日期的MM-DD部分转换到同一年(比如2000年,非闰年不影响9-12月的区间判断),再和基准区间(每年的9月1日到当前日期的MM-DD)做比较,从而标记Y/N。以下是不同工具的具体实现:
Excel 实现
假设日期数据在A列,直接用公式批量计算:
=IF(AND(DATE(2000,MONTH(A2),DAY(A2))>=DATE(2000,9,1),DATE(2000,MONTH(A2),DAY(A2))<=DATE(2000,MONTH(TODAY()),DAY(TODAY()))),"Y","N")
- 逻辑:把所有日期的月日拼到2000年,这样就能直接比较月日区间,完全忽略原年份的干扰。
SQL 实现
MySQL 版本
SELECT date_col, IF( STR_TO_DATE(CONCAT('2000-', DATE_FORMAT(date_col, '%m-%d')), '%Y-%m-%d') BETWEEN '2000-09-01' AND STR_TO_DATE(CONCAT('2000-', DATE_FORMAT(CURDATE(), '%m-%d')), '%Y-%m-%d'), 'Y', 'N' ) AS flag FROM your_table;
PostgreSQL 版本
SELECT date_col, CASE WHEN TO_DATE(TO_CHAR(date_col, 'MM-DD'), 'MM-DD') BETWEEN TO_DATE('09-01', 'MM-DD') AND TO_DATE(TO_CHAR(CURRENT_DATE, 'MM-DD'), 'MM-DD') THEN 'Y' ELSE 'N' END AS flag FROM your_table;
Python Pandas 实现
先确保日期列是datetime类型,再进行计算:
import pandas as pd # 转换日期列为datetime类型 df['date_col'] = pd.to_datetime(df['date_col']) # 获取当前日期的月日字符串 current_mmdd = pd.Timestamp.now().strftime('%m-%d') # 生成用于比较的统一年份日期 df['compare_date'] = pd.to_datetime('2000-' + df['date_col'].dt.strftime('%m-%d')) current_compare_date = pd.to_datetime('2000-' + current_mmdd) sept_01_compare = pd.to_datetime('2000-09-01') # 标记Y/N df['flag'] = df['compare_date'].apply(lambda x: 'Y' if sept_01_compare <= x <= current_compare_date else 'N') # 清理中间辅助列 df = df.drop('compare_date', axis=1)
内容的提问来源于stack exchange,提问作者Sam
相关产品推荐
相关产品推荐

