将整数转换为日期

6

我在将一个整数日期(20180525)转换为YYYY-MM-DD格式的日期时遇到了问题。有没有办法做到这一点,或者我应该在代码中进行转换(在这种情况下是Java)?非常感谢您对此的任何帮助。谢谢!


20180525 - 对我来说不像是一个整数日期,它看起来像是一个没有空格的字符串日期。那么20180525-626是什么意思? - Jasen
4个回答

13

如果您的日期以YYYYMMDD形式存储为整数,则可以先将其转换为TEXT,然后将其传递给日期函数。

SELECT date(20180525::TEXT)

否则,使用函数to_date和日期格式化程序:

SELECT to_date(20180525::text, 'YYYYMMDD')

2

简短版

SQL或Java都可以。对于SQL,请参考Ali的正确答案

对于Java,请将LocalDate传递给PreparedStatement查询。

LocalDate.parse(                      // `LocalDate` represents a date-only value without time-of-day and without time zone. Works with SQL-standard `DATE` type.
    Integer.toString( 20180525 ) ,    // Convert integer to text, for a `String` object as input.
    DateTimeFormatter.BASIC_ISO_DATE  // Specify a formatting pattern to match our input string.
)                                     // Returns a `LocalDate` object.

2018-05-25

java.time

关于Java中提到的问题,下面是使用现代的java.time类的代码。你应该使用SQL还是Java来解析字符串取决于你的情况和个人喜好,两种方法都可以。

LocalDate

LocalDate类表示一个仅包含日期而不包含时间和时区的值。

你需要指定一个格式化模式以匹配你的输入。在这种特殊情况下,你的输��字符串是标准的ISO 8601格式。具体来说,是最小化使用分隔符的ISO 8601格式的“basic”变体。在java.time中,你可以方便地找到预定义的特定格式化模式

String input = Integer.toString( 20180525 ) ;  // Convert integer to text for input as `String`. 
DateTimeFormatter f = DateTimeFormatter.BASIC_ISO_DATE ;
LocalDate ld = LocalDate.parse( input , f ) ;

ld.toString(): 2018-05-25

JDBC

从JDBC 4.2版本开始,您可以直接使用java.time对象与数据库进行交互。使用智能对象而不是愚蠢的字符串总是更好的选择。

String sql = "SELECT event_date FROM tbl WHERE event_date = ? ; " ;
…
myPreparedStatement.setObject( 1 , ld ) ;

检索和获取。

LocalDate ld = myResultSet.getObject( … , LocalDate.class ) ;

关于java.time

Java.time框架内置于Java 8及更高版本中。这些类替代了老旧的遗留日期时间类,例如java.util.DateCalendarSimpleDateFormat

现在处于维护模式Joda-Time项目建议迁移到java.time类。

要了解更多信息,请参阅Oracle教程,也可以在Stack Overflow上搜索许多示例和解释。规范是JSR 310

您可以直接与数据库交换java.time对象。使用符合JDBC 4.2或更高版本的JDBC驱动程序。无需字符串,无需java.sql.*类。

如何获取java.time类?

Java SE 8、Java SE 9、Java SE 10及其后续版本:
- 内置。 - 作为标准Java API的一部分,附带实现。 - Java 9增加了一些小功能和修复。
Java SE 6和Java SE 7:
- 大部分java.time功能已被移植到ThreeTen-Backport中,并可用于Java 6和7。
Android:
- 较新版本的Android捆绑了java.time类的实现。 - 对于早期的Android(<26),ThreeTenABP项目适配了ThreeTen-Backport(上述)。请参见如何使用ThreeTenABP...。

ThreeTen-Extra 项目扩展了 java.time 的附加类。该项目是 java.time 可能未来增加的一个试验场。您可能会在这里找到一些有用的类,例如 IntervalYearWeekYearQuarter 等等。更多详细信息请参见此处


1
安装Java在Postgres中只是为了做这件事似乎是走弯路。 - Jasen
2
@Jasen 不,我指的是客户端应用程序代码。请注意 String sql 行。 - Basil Bourque

1
select ((field_int)::text)::date as field_date from your_table;

0
不正确的答案是to_timestamp(timestamp_int)::date,但这确实是我在这个标题/问题下期望找到的。
有人将日期保存为整数20180525的解释表明世界充满了令人难以置信的想法。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接