SQL Server上月同期 日期的计算

遇到个需求,上月同期的日期计算,导致上月同期的数据少计算了1天,(此处的上月同期为 日期的截止日期,例:create_date < 上月同期截止日期),这里也包括了闰年的特殊情况
以下是一些测试用例:

如今天是 2019-10-31 上月同期就是 2019-10-1,
今天是 2019-10-30,上月同期  2019-9-30
今天是2019-3-29,上月同期为 2019-3-1
今天是2019-3-30 上月同期为 2019-3-1
今天是2020-3-29,上月同期为2020-2-29
今天是 2020-3-30 上月同期为 2020-3-1
declare  @start  datetime --开始日期
declare  @end  datetime -- 结束日期
declare  @today  datetime /*今天*/
declare  @tomorrow datetime /*明天*/

set @today = GETDATE()
set @tomorrow =dateadd(day,1,@today)
set @start = CONVERT(varchar(7), dateadd(mm,-1,@today) , 120) + '-01' -- 开始默认上月1号
set @end =  CONVERT(varchar(10), dateadd(mm,-1,@today)  , 120) -- 结束默认上月的今天
-- 如果今天是1号,上月开始时间为 上上月1号,结束为上月1号
if DAY(@today)=1 set @start = CONVERT(varchar(7),  dateadd(mm,-2,@today)  , 120)+ '-01' 
if DAY(@today)=1 set @end = CONVERT(varchar(7),  dateadd(mm,-1,@today)  , 120)+ '-01'

-- 如果今天是月末且月份在(1,3,5,7,10) 或  今天是3月30   或今天是平年的 2月29 
-- 这些条件的截止日期为上月今天+1,即本月1号
if (  datediff(month,@today,@tomorrow) = 1 and MONTH(@today) in(1,3,5,7,10)   ) 
		or (  MONTH(@today)=3 and DAY(@today)=30 ) 
		or ( MONTH(@today)=3 and DAY(@today)=29 and YEAR(@today)%4!=0 and YEAR(@today)%400!=0 
 )
	set @end = CONVERT(varchar(10),  dateadd(mm,-1,@today)+1  , 120)
-- coding: utf-8 -- import arcpy arcpy.env.overwriteOutput = True # 输入参数 input_feature_class = arcpy.GetParameterAsText(0) # 输入要素类 join_feature_class = arcpy.GetParameterAsText(1) # 连接要素类 output_feature_class = arcpy.GetParameterAsText(2) # 输出要素类 join_fields = arcpy.GetParameterAsText(3) # 连接字段 merge_fields = arcpy.GetParameterAsText(4) # 合并字段 min_area = arcpy.GetParameter(5) # 最小面积 # 创建空间连接 arcpy.SpatialJoin_analysis(input_feature_class, join_feature_class, output_feature_class, "JOIN_ONE_TO_MANY", "", "", "INTERSECT") # 创建输出要素类的字段列表 field_list = [f.name for f in arcpy.ListFields(output_feature_class)] # 创建合并字段的字典 merge_dict = {} # 遍历输出要素类中的要素 with arcpy.da.UpdateCursor(output_feature_class, field_list) as cursor: for row in cursor: # 如果要素面积大于最小面积,则进行合并 if row[0] > min_area: # 创建合并字段的键值 merge_key = tuple([row[field_list.index(f)] for f in merge_fields.split(";")]) # 如果合并字段的键值不存在,则添加到字典中 if merge_key not in merge_dict: merge_dict[merge_key] = [] # 将当前要素的连接字段值添加到字典中 join_values = [row[field_list.index(f)] for f in join_fields.split(";")] merge_dict[merge_key].append(join_values) # 删除不符合条件的要素 else: cursor.deleteRow() # 遍历合并字段的字典,将连接字段的值合并并更新到输出要素类中 with arcpy.da.UpdateCursor(output_feature_class, merge_fields.split(";")) as cursor: for row in cursor: merge_key = tuple(row) if merge_key in merge_dict: join_values = merge_dict[merge_key] join_values = ["/".join([str(v) for v in j]) for j in join_values] row = tuple(join_values) cursor.updateRow(row)运行错误:IndentationError: unexpected indent (空间连接.py, line 18) 执行(空间连接多对一)失败。请改正代码
05-25
# coding=UTF-8 # This Python file uses the following encoding: utf-8 import arcpy # 设置工作空间和环境设置 arcpy.env.workspace = "D:/数据备份" # 设置工作空间路径 arcpy.env.overwriteOutput = True # 允许覆盖输出 # 定义线图层和点图层的名称 line_layer = r"D:\数据备份\线1.shp" # 替换为线图层的名称 point_layer = r"D:\数据备份\点.shp" # 替换为点图层的名称 # 创建一个用于存储要删除的节点的列表 nodes_to_delete = [] # 遍历线图层中的每个要素 with arcpy.da.UpdateCursor(line_layer, ["SHAPE@"]) as cursor: for row in cursor: line_geometry = row[0] # 获取线几何对象 # 检查线的起点和终点是否与点图层中的点重叠 start_point = line_geometry.firstPoint end_point = line_geometry.lastPoint start_point_overlaps = False end_point_overlaps = False with arcpy.da.SearchCursor(point_layer, ["SHAPE@"]) as point_cursor: for point_row in point_cursor: point_geometry = point_row[0] # 获取点几何对象 # 检查起点是否与点重叠 if start_point.within(point_geometry): start_point_overlaps = True break # 检查终点是否与点重叠 if end_point.within(point_geometry): end_point_overlaps = True break # 如果起点和终点都没有与点重叠,则将该要素的所有节点添加到要删除的列表中 if not start_point_overlaps and not end_point_overlaps: for i in range(1, line_geometry.pointCount - 1): nodes_to_delete.append(i) # 删除要删除的节点 with arcpy.da.UpdateCursor(line_layer, ["SHAPE@"]) as cursor: for row in cursor: line_geometry = row[0] # 获取线几何对象 # 创建一个新的 Polyline 对象 new_line_geometry = arcpy.Polyline() # 复制需要保留的节点到新的 Polyline 对象中 for i in range(line_geometry.pointCount): if i not in nodes_to_delete: new_line_geometry.addPoint(line_geometry.getPart(0).getObject(i)) # 更新要素 cursor.updateRow([new_line_geometry]) print("节点删除完成!")
07-15
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值