server编写通用脚本实现获取一年前几天期的点子,Mysql钦点日期区间的领到方法

问题:

在数据库搬砖的历程中,免不了要跟日期打交道,举例按日期汇总一些指标、总括某段时间内的总量等。

在iOS中,大家管理时间的时候,往往会选用到NSDate其一类,可是有时大家可能也会动用到NSCalendar其一类,下边就先简要介绍下NSDate北京pk赛车官网下载,这个类。

在数据库编制程序开辟中,有的时候供给得到一年前的日期,以便以此为时间的分界点,查询其前后呼应的数据量。比如:

举个例子是平昔的日期幸好,只需直接钦赐就可以,但过多时候都是亟需根据近来天期自适应变化的。举例:提取下星期二到下周日的数据、提取上月的数量、提取前N个月的数量。。。

NSDate和字符串的相互作用调换

1.
想查询结束到一年前当天0点事情发生前的数据量,乃至一年前当天0点起来到前不久的数据量。2.
想查询结束到一年前当天24点以前的数据量,以至一年前当天24点开端到现行反革命的数据量。3.
想询问停止到一年前前段时间1日0点早前的数据量,以至一年前下月1日0点起来到明天的数据量。4.
想询问结束到一年前当月最终一天24点早先的数据量,以致一年前前些日子最后一天24点开头到以往的数据量。

这么些须求都有贰个合营点,就是要视当前天期而定!那么,大家就须要首先得到当前几日期的一部分音信,如当明日子是本周第几天、上个月第几天等,然后,能力做下一步管理。

1.将字符串转为带格式的日期

  • 字符串有准则的体裁

void string2date() {
    // 时间字符串
    NSString *string = @"2015-11-20 09:33:22";
    // 日期格式化类
    NSDateFormatter *fmt = [[NSDateFormatter alloc] init];
    // 设置日期格式(为了转换成功)
    fmt.dateFormat = @"yyyy-MM-dd HH:mm:ss";
    // NSString * -> NSDate *
    NSDate *date = [fmt dateFromString:string];
    NSString *newStr = [fmt stringFromDate:date];
    NSLog(@"%@", date);
    NSLog(@"%@", newStr);
}
// 打印结果
2016-10-20 01:33:22 +0000
2016-10-20 09:33:22

能够看来以上的打字与印刷结果是有多少个时辰的时差,那是由于地点的date所代表的区域是Green威治时间,我们处于的是东八区。

  • 字符串的体制不法规

上述的字符串是有着比较准绳的体裁,假设有个别服务器重返的结果是相比混乱的话,在对日期的格式样式重新初始化的话也是足以收获的想要的多寡。

void string2date2() {
    // 时间字符串
    NSString *string = @"10月-20号/2016年 09-10:05秒";
    // 日期格式化类
    NSDateFormatter *fmt = [[NSDateFormatter alloc] init];
    fmt.dateFormat = @"MM月-dd号/yyyy年 HH-mm:ss秒";
    NSLog(@"%@", [fmt dateFromString:string]);
}
// 打印结果
2016-10-20 01:10:05 +0000
  • 当字符串中有爱沙尼亚语的发布样式

void string2date3() {
    // 时间字符串
    NSString *string = @"Tue May 31 17:46:55 +0800 2011";
    // 日期格式化类
    NSDateFormatter *fmt = [[NSDateFormatter alloc] init];
    fmt.dateFormat = @"EEE MMM dd HH:mm:ss Z yyyy";
    // fmt.dateFormat = @"EEE MMM dd HH:mm:ss ZZZZ yyyy";
    // 设置语言区域(因为这种时间是欧美常用时间)
    fmt.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US"];
    NSLog(@"%@", [fmt dateFromString:string]);
}
// 打印结果
2016-05-31 09:46:55 +0000

地点的代码中的EEE代表的是星期的缩写,MMM表示的月份的缩写,个中的ZZZZZ表示的是时区。

  • 日子戳样式

有时候服务器重返大家的字符串不确定是上述的规行矩步的体裁恐怕是万分样式的字符串,重回给大家就是一长串的数字,那正是时间戳,其意思是偏离一九六七年一月1日0点0分0秒的时刻,单位是

void string2date4() {
    // 时间戳 : 从1970年1月1号 00:00:00开始走过的秒数
    // 时间字符串 - 时间戳
    NSString *string = @"1745645645645";
    // 转为秒为单位
    NSTimeInterval second = string.longLongValue / 1000.0;
    // 时间戳 -> NSDate *
    NSDate *date = [NSDate dateWithTimeIntervalSince1970:second];  
    NSLog(@"%@", date);
}
// 打印结果
2025-04-26 05:34:05 +0000

以上那各个景况的具体查询现象,有archive数据脚本开辟以前对数据库数据量的布满意况实行总括等,也是有依据当前天子动态总括一年来的增量增长幅度景况等。

一、在提取所需日期区间在此之前,大家先介绍多少个常用的函数

2.日期转为字符串

  • 转为有固定格式的字符串

void date2string() {
    // 获取当前的时间
    NSDate *date = [NSDate date];
    NSDateFormatter *fmt = [[NSDateFormatter alloc] init];
    // 给转换的字符串一个固定格式
    fmt.dateFormat = @"yyyy年MM月dd号 HH:mm:ss";
    NSString *string = [fmt stringFromDate:date];
    NSLog(@"----%@+++++", string);  
}
// 打印结果
----2016年10月24号 16:19:42+++++

在以上的代码中要求特意值得注意的是给字符串三个一定的格式,不然调换来的字符串就不亮堂以何种格式彰显出来,打字与印刷出来为空。

借使老是接到那样的供给需求获得一年后天期,然后每一次重复局算怎么去完结自然是不明智的,也许说公司内早就有人写了本子达成,但其它同事际遇相似的主题素材,又再次思考三次,那样就相比较浪费时间和生命力,耗在那么些细节上有个别精力,有一些像要做饭然则未有米将要先去买米的痛感,并且便于变成不一致人写的剧本不统一,不便利代码规范化标准化的规范化,分歧的人跟进的时候还要去考虑以前的人写的是何许逻辑。并且再也开荒脚本的话,又须求再行张开自测,不便宜升高级技术员作功能。

-- 先运行这一句SET @t = '2018-07-26 11:41:29';-- 再运行这一句SELECT DATE(@t)当前日期,YEAR(@t) 年份, MONTH(@t)月份,WEEK(@t)本年第几周, DAY(@t) 本月第几天, HOUR(@t)小时, MINUTE(@t)分钟, SECOND(@t)秒

得到到日期的年月日时分秒

一部分时候大家实际只要求得到届时间中的年月日等要素,当时就须求抽出时间成分中部分子成分。
借使回到的字符串的格式是平整的话就可以用定位的办法就足以截取到中间想要的要素。

void getComponentsOfDate() {
    // 时间字符串
    NSString *string = @"2016-10-20 09:10:05";
    NSString *month = [string substringWithRange:NSMakeRange(5, 2)];
    NSLog(@"%@", month);
}
// 打印结果
10

那般是足以截取到想要的结果,可是假如自身想得到时间中颇有的要素,将要重复数十次如此的代码,那样就相比较费心,所以不提议利用。大家得以虚构动用NSCalendar其一类中的方法去截取时间中的全体因素。

void getComponentsOfDate2() {
    // 时间字符串
    NSString *string = @"2016-10-20 09:10:05";
    // 日期格式化类
    NSDateFormatter *fmt = [[NSDateFormatter alloc] init];
    // 设置日期格式(为了转换成功)
    fmt.dateFormat = @"yyyy-MM-dd HH:mm:ss";
    // NSString * -> NSDate *
    NSDate *date = [fmt dateFromString:string];
    // 利用NSCalendar处理日期
    NSCalendar *calendar = [NSCalendar currentCalendar];
    NSInteger month = [calendar component:NSCalendarUnitMonth fromDate:date];
    NSInteger hour = [calendar component:NSCalendarUnitHour fromDate:date];
    NSInteger minute = [calendar component:NSCalendarUnitMinute fromDate:date];
    NSLog(@"%zd %zd %zd", month, hour, minute);
}
// 打印结果
10 09 10

假诺要叁遍性取得时间中的全体因素就足以考虑接收NSCalendarUnit类去得到时间知命之年月日等因素,那么些都以足以用或运算举行操作的。

void getComponentsOfDate3() {
    // 时间字符串
    NSString *string = @"2016-10-20 09:10:05";
    // 日期格式化类
    NSDateFormatter *fmt = [[NSDateFormatter alloc] init];
    // 设置日期格式(为了转换成功)
    fmt.dateFormat = @"yyyy-MM-dd HH:mm:ss";
    // NSString * -> NSDate *
    NSDate *date = [fmt dateFromString:string];
    // 利用NSCalendar处理日期
    NSCalendar *calendar = [NSCalendar currentCalendar];

    NSCalendarUnit unit = NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay | NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond;
    NSDateComponents *cmps = [calendar components:unit  fromDate:date];
    //    NSLog(@"%zd %zd %zd", cmps.year, cmps.month, cmps.day);
    NSLog(@"%@", cmps);
}
// 打印结果
<NSDateComponents: 0x101018c10>
    Calendar Year: 2016
    Month: 10
    Leap month: no
    Day: 20
    Hour: 9
    Minute: 10
    Second: 5

通过上述的unit能够取到想要的要素,放到NSDateComponents中打字与印刷出来。

施工方案:

运维出来,结果是如此的:

日子的可比

频仍偶尔会用届时刻与时光的并行比较,比方天涯论坛中,一条新浪的颁发,展览会示是如什么日期候揭橥的,如:“刚刚”、“二个时辰前”等,那亟需用到发布时间和近来岁月的相比较,何况通过一多级的判别彰显到分界面上去。

  • 简单比较

void dateCompare() {
    // 时间字符串
    NSString *createdAtString = @"2015-11-20 11:10:05";
    NSDateFormatter *fmt = [[NSDateFormatter alloc] init];
    fmt.dateFormat = @"yyyy-MM-dd HH:mm:ss";
    NSDate *createdAtDate = [fmt dateFromString:createdAtString];

    // 手机当前时间
    NSDate *nowDate = [NSDate date];

    /**
     NSComparisonResult的取值
     NSOrderedAscending = -1L, // 升序, 越往右边越大
     NSOrderedSame,  // 相等
     NSOrderedDescending // 降序, 越往右边越小
     */
    // 获得比较结果(谁大谁小)
    NSComparisonResult result = [nowDate compare:createdAtDate];
    if (result == NSOrderedAscending) { // 升序, 越往右边越大
        NSLog(@"createdAtDate > nowDate");
    } else if (result == NSOrderedDescending) { // 降序, 越往右边越小
        NSLog(@"createdAtDate < nowDate");
    } else {
        NSLog(@"createdAtDate == nowDate");
    }
}
// 打印结果
createdAtDate < nowDate

如上只可以比较出多个日子从前的程序或然是或不是为同一个时间,然则无法实际的相比较出四个时刻之内间隔的时间;

  • 间距时间

void dateCompare2() {
    // 时间字符串
    NSString *createdAtString = @"2016-11-20 09:10:05";
    NSDateFormatter *fmt = [[NSDateFormatter alloc] init];
    fmt.dateFormat = @"yyyy-MM-dd HH:mm:ss";
    NSDate *createdAtDate = [fmt dateFromString:createdAtString];

    // 手机当前时间
    //    NSDate *nowDate = [NSDate date];

    // 获得createdAtDate和nowDate的时间间隔(间隔多少秒)
    //    NSTimeInterval interval = [nowDate timeIntervalSinceDate:createdAtDate];
    NSTimeInterval interval = [createdAtDate timeIntervalSinceNow];
    NSLog(@"%f", interval);
}
// 打印结果
2305313.187479 
// 正表示当前时间之后的时间,负表示当前时间之前的时间。

timeIntervalSinceDate:表示二个岁月到另三个岁月的相间的时光;
timeIntervalSinceNow代表的是三个时刻到现在时刻之内相隔的岁月。

  • 高级相比较

如上的结果是足以赢得两个相比较的光阴之内的间距时间,不过并无法很好的反射出到底是间隔多少天可能是多少个月,能够依赖到NSCalendar中的一些主意能够缓慢解决上述的难题。

void dateCompare3() {
    NSDateFormatter *fmt = [[NSDateFormatter alloc] init];
    fmt.dateFormat = @"yyyy-MM-dd HH:mm:ss";

    // 时间字符串
    NSString *createdAtString = @"2015-11-01 09:10:05";
    NSDate *createdAtDate = [fmt dateFromString:createdAtString];
    // 其他时间
    NSString *otherString = @"2015-10-31 08:56:45";
    NSDate *otherDate = [fmt dateFromString:otherString];
    // 获得NSCalendar
    NSCalendar *calendar = nil;
    // 这个判断主要是由于iOS版本的限制,`calendarWithIdentifier: `这个方法是iOS8.0之后开始使用的
    if ([NSCalendar respondsToSelector:@selector(calendarWithIdentifier:)]) {
        calendar = [NSCalendar calendarWithIdentifier:NSCalendarIdentifierGregorian];
    } else {
        calendar = [NSCalendar currentCalendar];
    }

    // 获得日期之间的间隔
    NSCalendarUnit unit = NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay | NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond;
    NSDateComponents *cmps = [calendar components:unit fromDate:createdAtDate toDate:otherDate options:0];  
    NSLog(@"%@", cmps);
}
// 打印结果
<NSDateComponents: 0x10060a5e0>
    Calendar Year: 0
    Month: 0
    Day: -1
    Hour: 0
    Minute: -13
    Second: -20

从打字与印刷的结果能够精晓的观望三个日子之间的偏离多少日、时、分、秒等。

第一简单介绍一下中坚的知识点:

二、上边介绍多少个常用的日期加减运算函数

决断是不是为明天、前几天等

一部分时候要求判断当前的日期是或不是前不久要么是在此个月等的需要,那就须要作出剖断。

getdate(卡塔尔是赢妥贴即日子;dateadd能够对日期进行增减,在那处用来对年度减弱1,也足以用来对月份扩张1;convert可以对日期实行字符串截取调换操作,在这里地能够只截取形如2019-07-17的年月日,也足以只截取形如2019-07的大运部分。

1、ADDDATE(expr, days) / SUBDATE(expr, days):

系统方法

void judgeToday() {
    // 获得NSCalendar
    NSCalendar *calendar = nil;
    if ([NSCalendar respondsToSelector:@selector(calendarWithIdentifier:)]) {
        calendar = [NSCalendar calendarWithIdentifier:NSCalendarIdentifierGregorian];
    } else {
        calendar = [NSCalendar currentCalendar];
    }    
    NSDateFormatter *fmt = [[NSDateFormatter alloc] init];
    fmt.dateFormat = @"yyyy-MM-dd HH:mm:ss";
    NSLog(@"%zd", [calendar isDateInToday:[fmt dateFromString:@"2015-11-10 01:09:56"]]);  
}

如上的打字与印刷结果为0,所以得悉不是今天

// 今天的判断
- (BOOL)isDateInToday:(NSDate *)date NS_AVAILABLE(10_9, 8_0);
// 昨天的判断
- (BOOL)isDateInYesterday:(NSDate *)date NS_AVAILABLE(10_9, 8_0);
// 明天的判断
- (BOOL)isDateInTomorrow:(NSDate *)date NS_AVAILABLE(10_9, 8_0);
// 周末的判断
- (BOOL)isDateInWeekend:(NSDate *)date NS_AVAILABLE(10_9, 8_0);
// 是否为同一天
- (BOOL)isDate:(NSDate *)date1 inSameDayAsDate:(NSDate *)date2 NS_AVAILABLE(10_9, 8_0);

可以见见地点的代码都以iOS8.0过后现身的,所以在iOS8.0在此之前的版本是适用不了的,若是想要获得判别的话就供给和谐去封装,在那之中照旧须求动用NSCalendar其一类,因为这么些类能够取届时间中的全数因素。

然后正是指向地点4个难点对应的4个减轻措施:

ADDDAT函数有多个形参,第一个是准则日期,也即要求运算的日子;第一个是二个距离一览表达式,形如:INTE奥迪Q3VAL
1 HOU福睿斯,当中INTE宝马X5VAL
是间距的情趣,中间的数字1足以换来自由整数,第几个hour能够替换来day/month/year等日子单位。

自定义封装

  • 决断不久前

- (BOOL)isToday {
    // 判断self这个日期是否为今天
    NSCalendar *calendar = [NSCalendar calendar];  
    // 获得年月日元素
    NSCalendarUnit unit = NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay;
    // 获取到self这个日期中所有的元素
    NSDateComponents *selfCmps = [calendar components:unit fromDate:self];
     // 获取到`现在`这个日期中的所有元素
    NSDateComponents *nowCmps = [calendar components:unit fromDate:[NSDate date]];
    return selfCmps.year == nowCmps.year
    && selfCmps.month == nowCmps.month
    && selfCmps.day == nowCmps.day;
}
  • 认清前天或者前天

NSDateComponents *cmps = [calendar components:unit fromDate:selfDate toDate:nowDate options:0];
return cmps.year == 0
    && cmps.month == 0
    // 1代表昨天,-1代表明天(具体的还是要看具体代码的逻辑)
    && cmps.day == -1;// 1

总结:
1.在NSDate那么些类中得以对字符串转变来date数据,对转变来的字符串的格式是有须求的。
2.时间戳的拍卖,要看明白服务器重临的字符串的位数,要过细管理时间戳的单位。
3.NSCalendar以此类中得以对时间的拍卖多少相比高档的拍卖,有些功力是NSDate处理不了的。不过如果在iOS
8.0事情发生从前,有个别用法是亟需自定义封装的。
4.写的非凡的地点,还望大家一贯提出,大哥不胜多谢。

  1. 最简便,对眼明天子实行压缩1年的运算,然后只截取年月日。2.
    先对当下日子进行追加1天的运算,然后再收缩1年,最终只截取年月日。3.
    先对现阶段日子实行截取年月操作,然后再内定为前些时间01日,再减去1年,最终只截取年月日。4.
    先对眼后天期进行截取年月操作,然后再钦命为前些时间01日,再减削1年,并丰裕1个月,最后只截取年月日。

SUBDATE同理,只可是形成了减法运算。

最后就足以平昔在询问脚本规范中运用那些时间节点:

完整的用法如下:

询问总结时间节点早前:select count(*) from 表 where 时间字段 @datePoint

SELECT ADDDATE('2018-07-26 11:41:29',INTERVAL 1 HOUR);SELECT SUBDATE('2018-07-26 11:41:29',INTERVAL 1 HOUR);

询问计算时间节点伊始到现在:select count(*) from 表 where 时间字段 = @datePoint

2、DATE_ADD() / DATE_SUB():

脚本:

用法同ADDDATE(expr, days) / SUBDATE(expr, days)。

/* 功能:获取一年前日期 作者:zhang502219048 脚本来源:*/--1.截止到一年前当天0点declare @datePoint datetime = convert(varchar(10), dateadd(year, -1, getdate()), 120)select @datePoint as DatePointgo--2.截止到一年前当天24点declare @datePoint datetime = convert(varchar(10), dateadd(year, -1, dateadd(day, 1, getdate())), 120)select @datePoint as DatePointgo--3.截止到一年前当月1日0点declare @datePoint datetime = convert(varchar(10), dateadd(year, -1, convert(varchar(7), getdate(), 120) + '-01'), 120)select @datePoint as DatePointgo--4.截止到一年前当月最后一天24点declare @datePoint datetime = convert(varchar(10), dateadd(month, 1, dateadd(year, -1, convert(varchar(7), getdate(), 120) + '-01')), 120)select @datePoint as DatePointgo

三、日期区间截取

剧本运转结果:

接下去,利用方面介绍的日期函数的用法,就能够开展日期区间的截取了。

总结

1、上周

如上所述是小编给我们介绍的sql
server编写通用脚本达成获取一年前不久期的章程,希望对大家有所支持,若是大家有任何疑问请给小编留言,小编会及时恢复生机大家的。在这里也特别谢谢大家对台本之家网址的支撑!若是你以为本文对你有接济,接待转载,烦请注解出处,多谢!

-- 提取上周的日期区间SELECT CURDATE() NOW,ADDDATE(ADDDATE(DATE_SUB(CURDATE(),INTERVAL WEEKDAY(CURDATE()) + 1 DAY),-6),0) startdate,ADDDATE(DATE_SUB(CURDATE(),INTERVAL WEEKDAY(CURDATE()) + 1 DAY),0) duetodate

2、上月

-- 上月SELECT CURDATE() NOW, DATE_ADD(DATE_ADD(CURDATE(),INTERVAL -DAY(CURDATE())+1 DAY), INTERVAL -1 MONTH) startdate,DATE_ADD(DATE_ADD(CURDATE(),INTERVAL -DAY(CURDATE()) DAY), INTERVAL 0 MONTH) duetodate

3、前7个月

-- 前四个月SELECT CURDATE() NOW, ADDDATE(ADDDATE(CURDATE(),INTERVAL -DAY(CURDATE())+1 DAY), INTERVAL -4 MONTH) startdate,DATE_ADD(DATE_ADD(CURDATE(),INTERVAL -DAY(CURDATE()) DAY), INTERVAL 0 MONTH) duetodate

4、前一周五到本周二

不时不是依照自然周举行总计的,要求自定义七日的起止日期,能够服从下边包车型地铁法子:

SELECT ADDDATE(DATE_SUB(CURDATE(),INTERVAL (IF(WEEKDAY(CURDATE())IN(3,4,5,6),WEEKDAY(CURDATE()),WEEKDAY(CURDATE())+7 )) + 1 DAY),-3) startdate, ADDDATE(DATE_SUB(CURDATE(),INTERVAL (IF(WEEKDAY(CURDATE())IN(3,4,5,6),WEEKDAY(CURDATE()),WEEKDAY(CURDATE())+7 )) + 1 DAY),3)duetodate

OK,至此就足以兑现时间、日期的新闻提取、放肆区间的截取了~

总结

如上所述是笔者给大家介绍的Mysql钦赐日期区间的领到方法,希望对大家全数助于,如若大家有其余疑问请给本身留言,小编会及时回复我们的。在这里也特别谢谢我们对台本之家网址的支撑!

发表评论

电子邮件地址不会被公开。 必填项已用*标注