ORA-01861:尽管使用了to_date函数,但文字不匹配格式字符串

时间:2019-04-02 11:19:08

标签: excel vba oracle oracle11g

在EXCEL VBA模块上解决此错误。在Oracle 11g界面上,它运行良好。

Package com.example.rami_.esmatsongs;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import com.theartofdev.edmodo.cropper.CropImage;
import com.theartofdev.edmodo.cropper.CropImageView;
import static android.app.Activity.RESULT_OK;
/**
 * A simple {@link Fragment} subclass.
 */
public class AccountFragment extends Fragment {
    private ImageView profile_picture;
    private TextView edit_profile_picture;
    public AccountFragment() {
        // Required empty public constructor
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                 Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        View view = inflater.inflate(R.layout.fragment_account, container, false);
        profile_picture = (ImageView) view.findViewById(R.id.profilePicture);
        profile_picture.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                cropImage();
            }
        });
        edit_profile_picture = (TextView) view.findViewById(R.id.changeProfilePic);
        edit_profile_picture.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                cropImage();
            }
        });
        return view;
    }

    public void cropImage() {
        CropImage.activity()
                 .setGuidelines(CropImageView.Guidelines.ON)
                 .setMinCropResultSize(512, 512)
                 .setAspectRatio(1, 1)
                 .getIntent(getContext());
    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == CropImage.CROP_IMAGE_ACTIVITY_REQUEST_CODE) {
            CropImage.ActivityResult result = CropImage.getActivityResult(data);
            if (resultCode == RESULT_OK) {
                Uri postImageUri = result.getUri();
                profile_picture.setImageURI(postImageUri);
            } else if (resultCode == CropImage.CROP_IMAGE_ACTIVITY_RESULT_ERROR_CODE) {
                Exception error = result.getError();
            }
        }
    }
}

预期结果是我不应该收到错误,而实际结果是===>当我在ORACLE SQL Developer中运行相同的查询时,它可以完美运行,但不能在excel VBA模块中运行。

1 个答案:

答案 0 :(得分:1)

  

尽管使用了to_date函数

实际上是因为使用了to_date()函数。你有这样的事情:

TO_DATE(SYSDATE,'DD-MM-YYYY')
TO_DATE(s2.end_time,'DD-MM-YYYY')
TO_DATE(next_day(SYSDATE,'SATURDAY'),'DD-MM-YYYY')
TO_DATE(next_day(SYSDATE,'SATURDAY')-(INTERVAL '7' DAY + INTERVAL '1' SECOND),'DD-MM-YYYY')

第二个可能可以,但是仅当sd.end_time存储为字符串时-几乎肯定不应该这样做。

至少对于其他三个,您正在将已经是日期的传递给函数,该函数可以将字符串转换为日期。因此,您实际上在做,例如:

TO_DATE(TO_CHAR(SYSDATE),'DD-MM-YYYY')

,因为隐式TO_CHAR()没有格式模型,它将使用会话的NLS设置,特别是NLS_DATE_FORMAT。您会看到它在一种环境中工作,因为那里的设置有效地表明它正在运行:

TO_DATE(TO_CHAR(SYSDATE, 'DD-MM-YYYY'),'DD-MM-YYYY')

在另一个会话中,它实际上可能正在做:

TO_DATE(TO_CHAR(SYSDATE, 'DD-MON-RR'),'DD-MM-YYYY')

...将失去世纪,将日期值保留在0019年而不是2019年;或

TO_DATE(TO_CHAR(SYSDATE, 'YYYY-MM-DD'),'DD-MM-YYYY')

如您所见,它会抛出“ ORA-01861:文字与格式字符串不匹配”。

尽管您可以尝试强制每个客户端和应用程序上的NLS设置与您的操作相匹配,但最终会出错,因此您应该进行所有转换。只需使用SYSDATE和其他直接计算出的值即可;或者,如果您想获取时间设置为午夜的日期,则将其截断:

trunc(SYSDATE)
trunc(s2.end_time)
trunc(next_day(SYSDATE,'SATURDAY'))
trunc(next_day(SYSDATE,'SATURDAY')-(INTERVAL '7' DAY + INTERVAL '1' SECOND))

还请注意,next_day()的第二个参数是当前会话日期语言中的日期名称或缩写,因此从会话中以另一种语言运行该日期的人也会看到错误(例如“ ORA-01846:不是一周中的有效日期”。