Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is there a simple way to make Sequelize return it's date/time fields in a particular format?

Tags:

We need to have sequelize return dates in a particular format, not the default one. As far as I can tell, there is no way to set that up in options, or any other way. Short of manually updating the dates every time after they are retrieved, anyone been able to solve this easily? Or am I missing something?

like image 356
CargoMeister Avatar asked May 30 '13 23:05

CargoMeister


People also ask

How do you get the current date in Sequelize?

const TODAY = new Date(); const SUM = await OrdersModel. sum('price', { where: { created: Sequelize. DATE(TODAY), }, }); console. log(SUM);

How do I use timestamp in Sequelize?

Using TIMESTAMP instead of DATETIME typeconst User = sequelize. define( "User", { firstName: Sequelize. STRING, createdAt: { type: "TIMESTAMP", defaultValue: sequelize. literal("CURRENT_TIMESTAMP"), allowNull: false, }, updatedAt: { type: "TIMESTAMP", defaultValue: sequelize.


2 Answers

You can, use the Sequelize fn method. From the API Reference, the fn function will help create an object representing a SQL function in your query.

For example:

model.findAll({
  attributes: [
      'id',
      [sequelize.fn('date_format', sequelize.col('date_col'), '%Y-%m-%d'), 'date_col_formed']
  ]})
  .then(function(result) {
    console.log(result);
  });

Will return data values:

[
  {"id": 1, "date_col_formed": "2014-01-01"},
  {"id": 2, "date_col_formed": "2014-01-02"}
   // and so on...
]
like image 194
Jon Saw Avatar answered Oct 13 '22 17:10

Jon Saw


21/06/2019

A little bit late but providing an update.

Sequelize is a powerful ORM (I am not saying is the best solution out there) but has a very bad documentation.

Anyway if you want to have this configured in your models one way apart from having to repeat this across your queries as other responses state you could be doing:

     const Test = sequelize.define('test', {
                // attributes
                name: {
                    type: DataType.STRING,
                    allowNull: false
                },
                createdAt: {
                    type: DataType.DATE,
     //note here this is the guy that you are looking for                   
                  get() {
                        return moment(this.getDataValue('createdAt')).format('DD/MM/YYYY h:mm:ss');
                    }
                },
                updatedAt: {
                    type: DataType.DATE,
                    get() {
                        return moment(this.getDataValue('updatedAt')).format('DD/MM/YYYY h:mm:ss');
                    }
                }

If you are using dates to provide info as: last updated, first login, last login. This is the way to go.

The function get returns the new formatted element so it should not be restricted to dates either! Just bear in mind that this will slow your query so use cautiously. ;)

more info (i know i know but docs is the name of the game): http://docs.sequelizejs.com/manual/models-definition.html#getters--amp--setters

like image 42
iwaduarte Avatar answered Oct 13 '22 16:10

iwaduarte