简体   繁体   中英

Date_Trunc and To_Date Questions SQL

  1. Can we use date_trunc for a date (not date-time) that we are trying to "truncate" (not sure if the term can be applied here) to eg the start of the week? So if I have date_trunc(week, 28/10/2020) and I want to get the start of the week that 28th of October lies in (so 26th of October)? I tried this in my SQL command line but I get error messages.

  2. If I am doing: SELECT to_date ('02 Oct 2001', 'DD Mon YYYY'); How can I ensure the resulting format is in a date format I specify (rather than the default date format)? For example if I want it in format DD-MM-YYYY?

  3. select to_char(date '2017-06-02', 'MM') < in this example, why do we need "date" for this to work? The general format for to_char should be TO_CHAR (timestamp_expression, 'format'). I don't see in this general format that we need "day".

  4. if I have a WHERE filter like to_char(order_date, '20-10-2020') , and there are indeed some rows with this order date, will these rows still show in my results (after running query) if these rows are in DATE format (so 20 Oct is in date format) as opposed to string (which is what I am filtering by as I am doing to_char). I know there would be no need to use to_char in this case but just asking..

  1. yes, you can use date in text form but you have to cast it to a correct type

these queries will work

select date_trunc('week', '2020-10-28'::date);
select date_trunc('week', '10/28/2020'::date);
-- as well as 
select date_trunc('week', '2020-10-28'::datetime);

and return timestamp 2020-10-26 00:00:00.000000

note, next query

select date_trunc('week', '28/10/2020'::date);

will fail with error date/time field value out of range: "28/10/2020";

  1. You can use to_char , it returns text , if you need a date format you have to case it again
select to_char( to_date ('02 Oct 2001', 'DD Mon YYYY'), 'DD-MM-YYYY')::date;

select to_char('02 Oct 2001'::date, 'DD-MM-YYYY')::date;
  1. '2017-06-02' is a text and it can't be automatically converted to timestamp. Actually I don't know a text format which can.

  2. No, you need to explicitly cast into date type to use it as a filter

where order_date = date_stored_as_a_text::date

I am answering the questions in a different order as there are some wrong assumptions:

Question 3

There is a general difference between '2017-06-02' and date '2017-06-02' - the first one is just a varchar, a string, NOT handled as a date by Redshift, the 2nd one tells Redshift to handle the string as date and therefore works.

Question 2

A date data type column has no format - you may an sql client that can display date columns in different formats, however, this is not a functionality of redshift. SELECT to_date ('02 Oct 2001', 'DD Mon YYYY'); tells redshift to convert the string '02 Oct 2001' to date.

Question 1

DATE_TRUNC('datepart', timestamp) also supports week as datepart - see Date parts for date or timestamp function ( Also shown in the example of AWS ). You should also be able to provide a date instead of a timestamp.

Question 4

to_char(order_date, '20-10-2020') is not a filter and you are using it wrong.

AWS TO_CHAR

TO_CHAR converts a timestamp or numeric expression to a character-string data format.

I guess you are rather looking for:

where to_char(order_date, 'YYYY-MM-DD') = '20-10-2020'

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM