【问题标题】:How to retrieve the Date part out of a Datetime result column in SQLite?如何从 SQLite 中的日期时间结果列中检索日期部分?
【发布时间】:2011-08-16 07:47:22
【问题描述】:

我有一个日期时间类型的列,我只想从中检索日期。有没有办法做到这一点?

以前它是一个纪元值,我将其转换为 datetime 。

这是一个示例结果:

smbd|ip address|1082|ip address|"2011-04-26 18:40:34"

我尝试了以下命令,但结果为负/零

SELECT DATE(datetime) from attacked_total;
SELECT STRFTIME('%Y-%m-%d', datetime) FROM attacked_total;
SELECT DATETIME('%Y-%m-%d', datetime) FROM attacked_total;
SELECT DATE('%Y-%m-%d', datetime) FROM attacked_total;

【问题讨论】:

    标签: sql database sqlite


    【解决方案1】:

    您可以使用DATE 函数。

    例子

    > select date('2011-04-26 18:40:34')
    > 2011-04-26
    

    你只能用 strftime 得到一天,

    > select strftime('%d', '2011-04-26 18:40:34')
    > 26
    

    【讨论】:

    • 嗯,我知道这个功能。但是我不能将它用于我的称为日期时间的列。当我从 tablename 查询 select date('datetime') 时,返回一个空白答案。感谢你的及时回复 ! :)
    • @user,不要将日期时间放在引号内。试试date(datetime)
    • erm,仍然返回空白答案。
    • @user,您要发布确切的查询吗?
    • 好的,就这样!表名:attacked_total,列:日期时间查询:从attacked_total中选择日期(日期时间);
    【解决方案2】:

    这行得通。

    SELECT strftime('%d', '2011-04-26')
    

    您可以获得年、月、日以及日期中包含的所有其他内容。

    但是你必须小心你如何输入这些字符串。

    日期的格式是YYYY-MM-DD,所以你必须输入那个格式的字符串。

    它也区分大小写。如果你想要一个月,那么你应该使用%m,因为如果你使用%M,它会尝试获取分钟,如果你的日期中没有时间部分,它会抛出错误。

    更多信息请查看SQLite official site

    【讨论】:

      【解决方案3】:

      如果您使用 SQLite,请尝试使用此功能

      strftime('%Y', current_date)

      strftime('%m', current_date)

      strftime('%d', current_date)

      strftime('%H', current_date)

      strftime('%M', current_date)

      strftime('%S', current_date)

      如果您使用 Hibernate,请尝试在 SQLiteDialect 类中注册此函数

       registerFunction("year", new SQLFunctionTemplate(StandardBasicTypes.INTEGER, "abs(strftime('%Y', ?1))"));
          registerFunction("month", new SQLFunctionTemplate(StandardBasicTypes.INTEGER, "abs(strftime(strftime('%m', ?1))"));
          registerFunction("day", new SQLFunctionTemplate(StandardBasicTypes.INTEGER, "abs(strftime(strftime('%d', ?1))"));
          registerFunction("hour", new SQLFunctionTemplate(StandardBasicTypes.INTEGER, "abs(strftime(strftime('%H', ?1))"));
          registerFunction("minute", new SQLFunctionTemplate(StandardBasicTypes.INTEGER, "abs(strftime(strftime('%M', ?1))"));
          registerFunction("second", new SQLFunctionTemplate(StandardBasicTypes.INTEGER, "abs(strftime(strftime('%S', ?1))"));
      

      如果你想提出任何建议,我会离开我的 SQLiteDialect 课程

      import java.sql.SQLException;
      import java.sql.Types;
      
      import org.hibernate.JDBCException;
      import org.hibernate.ScrollMode;
      import org.hibernate.dialect.Dialect;
      import org.hibernate.dialect.function.AbstractAnsiTrimEmulationFunction;
      import org.hibernate.dialect.function.NoArgSQLFunction;
      import org.hibernate.dialect.function.SQLFunction;
      import org.hibernate.dialect.function.SQLFunctionTemplate;
      import org.hibernate.dialect.function.StandardSQLFunction;
      import org.hibernate.dialect.function.VarArgsSQLFunction;
      import org.hibernate.dialect.identity.IdentityColumnSupport;
      import utiles.SQLiteDialectIdentityColumnSupport;
      import org.hibernate.dialect.pagination.AbstractLimitHandler;
      import org.hibernate.dialect.pagination.LimitHandler;
      import org.hibernate.dialect.pagination.LimitHelper;
      import org.hibernate.dialect.unique.DefaultUniqueDelegate;
      import org.hibernate.dialect.unique.UniqueDelegate;
      import org.hibernate.engine.spi.RowSelection;
      import org.hibernate.exception.DataException;
      import org.hibernate.exception.JDBCConnectionException;
      import org.hibernate.exception.LockAcquisitionException;
      import org.hibernate.exception.spi.SQLExceptionConversionDelegate;
      import org.hibernate.exception.spi.TemplatedViolatedConstraintNameExtracter;
      import org.hibernate.exception.spi.ViolatedConstraintNameExtracter;
      import org.hibernate.internal.util.JdbcExceptionHelper;
      import org.hibernate.mapping.Column;
      import org.hibernate.type.StandardBasicTypes;
      
      /**
       * An SQL dialect for SQLite 3.
       */
      public class SQLiteDialect5 extends Dialect {
      
          private final UniqueDelegate uniqueDelegate;
      
          public SQLiteDialect5() {
              registerColumnType(Types.BIT, "boolean");
              //registerColumnType(Types.FLOAT, "float");
              //registerColumnType(Types.DOUBLE, "double");
              registerColumnType(Types.DECIMAL, "decimal");
              registerColumnType(Types.CHAR, "char");
              registerColumnType(Types.LONGVARCHAR, "longvarchar");
              registerColumnType(Types.TIMESTAMP, "datetime");
              registerColumnType(Types.BINARY, "blob");
              registerColumnType(Types.VARBINARY, "blob");
              registerColumnType(Types.LONGVARBINARY, "blob");
      
              registerFunction("concat", new VarArgsSQLFunction(StandardBasicTypes.STRING, "", "||", ""));
              registerFunction("mod", new SQLFunctionTemplate(StandardBasicTypes.INTEGER, "?1 % ?2"));
              registerFunction("quote", new StandardSQLFunction("quote", StandardBasicTypes.STRING));
              registerFunction("random", new NoArgSQLFunction("random", StandardBasicTypes.INTEGER));
              registerFunction("round", new StandardSQLFunction("round"));
              registerFunction("substr", new StandardSQLFunction("substr", StandardBasicTypes.STRING));
              registerFunction("year", new SQLFunctionTemplate(StandardBasicTypes.INTEGER, "abs(strftime('%Y', ?1))"));
              registerFunction("month", new SQLFunctionTemplate(StandardBasicTypes.INTEGER, "abs(strftime(strftime('%m', ?1))"));
              registerFunction("day", new SQLFunctionTemplate(StandardBasicTypes.INTEGER, "abs(strftime(strftime('%d', ?1))"));
              registerFunction("hour", new SQLFunctionTemplate(StandardBasicTypes.INTEGER, "abs(strftime(strftime('%H', ?1))"));
              registerFunction("minute", new SQLFunctionTemplate(StandardBasicTypes.INTEGER, "abs(strftime(strftime('%M', ?1))"));
              registerFunction("second", new SQLFunctionTemplate(StandardBasicTypes.INTEGER, "abs(strftime(strftime('%S', ?1))"));
              registerFunction("trim", new AbstractAnsiTrimEmulationFunction() {
                  @Override
                  protected SQLFunction resolveBothSpaceTrimFunction() {
                      return new SQLFunctionTemplate(StandardBasicTypes.STRING, "trim(?1)");
                  }
      
                  @Override
                  protected SQLFunction resolveBothSpaceTrimFromFunction() {
                      return new SQLFunctionTemplate(StandardBasicTypes.STRING, "trim(?2)");
                  }
      
                  @Override
                  protected SQLFunction resolveLeadingSpaceTrimFunction() {
                      return new SQLFunctionTemplate(StandardBasicTypes.STRING, "ltrim(?1)");
                  }
      
                  @Override
                  protected SQLFunction resolveTrailingSpaceTrimFunction() {
                      return new SQLFunctionTemplate(StandardBasicTypes.STRING, "rtrim(?1)");
                  }
      
                  @Override
                  protected SQLFunction resolveBothTrimFunction() {
                      return new SQLFunctionTemplate(StandardBasicTypes.STRING, "trim(?1, ?2)");
                  }
      
                  @Override
                  protected SQLFunction resolveLeadingTrimFunction() {
                      return new SQLFunctionTemplate(StandardBasicTypes.STRING, "ltrim(?1, ?2)");
                  }
      
                  @Override
                  protected SQLFunction resolveTrailingTrimFunction() {
                      return new SQLFunctionTemplate(StandardBasicTypes.STRING, "rtrim(?1, ?2)");
                  }
              });
              uniqueDelegate = new SQLiteUniqueDelegate(this);
          }
      
          // database type mapping support ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
          @Override
          public String getCastTypeName(int code) {
              // FIXME
              return super.getCastTypeName(code);
          }
      
          // IDENTITY support ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
          private static final SQLiteDialectIdentityColumnSupport IDENTITY_COLUMN_SUPPORT = new SQLiteDialectIdentityColumnSupport();
      
          @Override
          public IdentityColumnSupport getIdentityColumnSupport() {
              return IDENTITY_COLUMN_SUPPORT;
          }
      
          // limit/offset support ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
          private static final AbstractLimitHandler LIMIT_HANDLER = new AbstractLimitHandler() {
              @Override
              public String processSql(String sql, RowSelection selection) {
                  final boolean hasOffset = LimitHelper.hasFirstRow(selection);
                  return sql + (hasOffset ? " limit ? offset ?" : " limit ?");
              }
      
              @Override
              public boolean supportsLimit() {
                  return true;
              }
      
              @Override
              public boolean bindLimitParametersInReverseOrder() {
                  return true;
              }
          };
      
          @Override
          public LimitHandler getLimitHandler() {
              return LIMIT_HANDLER;
          }
      
          // lock acquisition support ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
          @Override
          public boolean supportsLockTimeouts() {
              // may be http://sqlite.org/c3ref/db_mutex.html ?
              return false;
          }
      
          @Override
          public String getForUpdateString() {
              return "";
          }
      
          @Override
          public boolean supportsOuterJoinForUpdate() {
              return false;
          }
      
          /*
          @Override
        public boolean dropTemporaryTableAfterUse() {
          return true; // temporary tables are only dropped when the connection is closed. If the connection is pooled...
        }
           */
          // current timestamp support ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
          @Override
          public boolean supportsCurrentTimestampSelection() {
              return true;
          }
      
          @Override
          public boolean isCurrentTimestampSelectStringCallable() {
              return false;
          }
      
          @Override
          public String getCurrentTimestampSelectString() {
              return "select current_timestamp";
          }
      
          // SQLException support ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
          private static final int SQLITE_BUSY = 5;
      
          private static final int SQLITE_LOCKED = 6;
      
          private static final int SQLITE_IOERR = 10;
      
          private static final int SQLITE_CORRUPT = 11;
      
          private static final int SQLITE_NOTFOUND = 12;
      
          private static final int SQLITE_FULL = 13;
      
          private static final int SQLITE_CANTOPEN = 14;
      
          private static final int SQLITE_PROTOCOL = 15;
      
          private static final int SQLITE_TOOBIG = 18;
      
          private static final int SQLITE_CONSTRAINT = 19;
      
          private static final int SQLITE_MISMATCH = 20;
      
          private static final int SQLITE_NOTADB = 26;
      
          @Override
          public SQLExceptionConversionDelegate buildSQLExceptionConversionDelegate() {
              return new SQLExceptionConversionDelegate() {
                  @Override
                  public JDBCException convert(SQLException sqlException, String message, String sql) {
                      final int errorCode = JdbcExceptionHelper.extractErrorCode(sqlException);
                      if (errorCode == SQLITE_TOOBIG || errorCode == SQLITE_MISMATCH) {
                          return new DataException(message, sqlException, sql);
                      } else if (errorCode == SQLITE_BUSY || errorCode == SQLITE_LOCKED) {
                          return new LockAcquisitionException(message, sqlException, sql);
                      } else if ((errorCode >= SQLITE_IOERR && errorCode <= SQLITE_PROTOCOL) || errorCode == SQLITE_NOTADB) {
                          return new JDBCConnectionException(message, sqlException, sql);
                      }
      
                      // returning null allows other delegates to operate
                      return null;
                  }
              };
          }
      
          @Override
          public ViolatedConstraintNameExtracter getViolatedConstraintNameExtracter() {
              return EXTRACTER;
          }
      
          private static final ViolatedConstraintNameExtracter EXTRACTER = new TemplatedViolatedConstraintNameExtracter() {
              @Override
              protected String doExtractConstraintName(SQLException sqle) throws NumberFormatException {
                  final int errorCode = JdbcExceptionHelper.extractErrorCode(sqle);
                  if (errorCode == SQLITE_CONSTRAINT) {
                      return extractUsingTemplate("constraint ", " failed", sqle.getMessage());
                  }
                  return null;
              }
          };
      
          // union subclass support ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
          @Override
          public boolean supportsUnionAll() {
              return true;
          }
      
          // DDL support ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
          @Override
          public boolean canCreateSchema() {
              return false;
          }
      
          @Override
          public boolean hasAlterTable() {
              // As specified in NHibernate dialect
              return false;
          }
      
          @Override
          public boolean dropConstraints() {
              return false;
          }
      
          @Override
          public boolean qualifyIndexName() {
              return false;
          }
      
          @Override
          public String getAddColumnString() {
              return "add column";
          }
      
          @Override
          public String getDropForeignKeyString() {
              throw new UnsupportedOperationException("No drop foreign key syntax supported by SQLiteDialect");
          }
      
          @Override
          public String getAddForeignKeyConstraintString(String constraintName,
                  String[] foreignKey, String referencedTable, String[] primaryKey,
                  boolean referencesPrimaryKey) {
              throw new UnsupportedOperationException("No add foreign key syntax supported by SQLiteDialect");
          }
      
          @Override
          public String getAddPrimaryKeyConstraintString(String constraintName) {
              throw new UnsupportedOperationException("No add primary key syntax supported by SQLiteDialect");
          }
      
          @Override
          public boolean supportsCommentOn() {
              return true;
          }
      
          @Override
          public boolean supportsIfExistsBeforeTableName() {
              return true;
          }
      
          /* not case insensitive for unicode characters by default (ICU extension needed)
          public boolean supportsCaseInsensitiveLike() {
          return true;
        }
           */
          @Override
          public boolean doesReadCommittedCauseWritersToBlockReaders() {
              // TODO Validate (WAL mode...)
              return true;
          }
      
          @Override
          public boolean doesRepeatableReadCauseReadersToBlockWriters() {
              return true;
          }
      
          @Override
          public boolean supportsTupleDistinctCounts() {
              return false;
          }
      
          @Override
          public int getInExpressionCountLimit() {
              // Compile/runtime time option: http://sqlite.org/limits.html#max_variable_number
              return 1000;
          }
      
          @Override
          public UniqueDelegate getUniqueDelegate() {
              return uniqueDelegate;
          }
      
          private static class SQLiteUniqueDelegate extends DefaultUniqueDelegate {
      
              public SQLiteUniqueDelegate(Dialect dialect) {
                  super(dialect);
              }
      
              @Override
              public String getColumnDefinitionUniquenessFragment(Column column) {
                  return " unique";
              }
          }
      
          @Override
          public String getSelectGUIDString() {
              return "select hex(randomblob(16))";
          }
      
          @Override
          public ScrollMode defaultScrollMode() {
              return ScrollMode.FORWARD_ONLY;
          }
      }
      

      这是 Hibernate 5.1

      【讨论】:

        【解决方案4】:

        尝试在 SQL 中查找“datepart”函数的用法。

        这样的事情应该可以工作:

        SELECT datewithouttime as datepart(dd,datefield)+'/'+datepart(mm,datefield)+"/"+datepart(yyyy,datefield) FROM tableName
        

        【讨论】:

        • SELECT datepart(dd,datefield)+'/'+datepart(mm,datefield)+"/"+datepart(yyyy,datefield) AS datewithouttime FROM tableName
        • 嗯,我不太明白你的代码。我有一个名为 datetime 的列来仅检索日期和一个名为attacked_total 的表。因此,我将您的查询修改为 SELECT datetime(datetime,datefield)+'/'+datetime(mm,datefield)+"/"+datetime(yyyy,datefield) AS datewithouttime FROM attacked_total limit 5。这是正确的吗?再次感谢您的回答!
        • @Coomie,SQLite 没有datepart 函数。
        • @Coomie,我们都会犯错 ;)
        猜你喜欢
        • 1970-01-01
        • 2021-07-12
        • 2019-07-01
        • 2011-07-17
        • 1970-01-01
        • 2020-06-02
        • 2012-01-30
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多