首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Perl时间,日期转换错误

Perl时间,日期转换错误
EN

Stack Overflow用户
提问于 2012-05-08 01:14:55
回答 2查看 1.6K关注 0票数 2

这是一个perl脚本,用于从10月1日开始的100天内每天提取sql数据,并且SQL在日期格式(yyyy-mm-dd)上非常挑剔,所以我编写了如下脚本。但是,在2011-11-06特定日期,时间到日期转换不正确,开始日期和结束日期变得相同。

代码语言:javascript
复制
$srt_date='2011-11-06'
$end_date='2011-11-06'

我不知道这是perl错误还是其他原因。

代码语言:javascript
复制
use DBI;
use DBD::Oracle qw(:ora_types);
use Compress::Zlib;
use FileHandle;
use Date::Parse;
use Date::Format;

$st_day=str2time('2011-10-1');

@days=(0..100);

foreach $daynum (@days){
$dt1 = $st_day+3600*(24*$daynum);
$dt2 = $st_day+3600*(24*($daynum+1));
$srt_date = time2str("%d-%h-%Y", $dt1);
$end_date = time2str("%d-%h-%Y", $dt2);
print $srt_date, ',' ,$end_date, '\n';
my $sqlGetEid = "select x,y from z where DATETIME>='$srt_date' and DATETIME<'$end_date'";
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-05-08 02:06:37

下面是DateTime如何正确处理DST转换:

代码语言:javascript
复制
use strict; #ALWAYS!
use warnings; #ALWAYS!
use DateTime;

my $st_day = '2011-10-1';

my ($year, $month, $day) = split /-/, $st_day;

my $dt = DateTime->new(
    year => $year,
    month => $month,
    day => $day,
    time_zone => 'local',
);

my @days = 0..100;
foreach my $daynum (@days) {
    my $dt1 = $dt->ymd;
    my $dt2 = $dt->add(days => 1)->ymd;
    printf "%s,%s\n", $dt1, $dt2;
}
票数 1
EN

Stack Overflow用户

发布于 2012-05-08 16:51:40

我不确定您到底想要实现什么,但当您可以完成以下操作时,为什么还要费心执行100条SQL语句:

代码语言:javascript
复制
SELECT trunc(datetime, 'DD') truncdate, x,y
FROM z WHERE datetime between '2011-10-01'
AND to_date('20111001', 'YYYYMMDD') + 99

使用truncdate作为关键字填充散列,如果日期是ISO8601,则通过使用常规(cmp)排序遍历散列将获得相同的排序。

编辑:我将阐明您是如何做到这一点的:

代码语言:javascript
复制
my $sth = $mdbh->prepare("SELECT trunc(datetime, 'DD') truncdate, x,y
    FROM z WHERE datetime between '2011-10-01'
    AND to_date('20111001', 'YYYYMMDD') + 99
    ORDER BY truncdate");
$sth->execute();

my $lastdate = "";
my $fh;    

while (my $row = $sth->fetchrow_hashref()) {

    # If new date, create new file
    if ($row->{truncdate} ne $lastdate) {
        close($fh) if $fh;
        open($fh, ">", "$row->{truncdate}.csv") or die "Unable to create file '$row->{truncdate}.csv': $!\n";
    }

    print $fh "$row->{x},$row->{y}\n";
    $lastdate = $row->{truncdate};
}
close($fh) if $fh;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10486208

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档