日期运行和截止日期问题SQL


  1. 我们可以使用date_trunc来表示我们试图"截断";(不确定这个术语是否可以在这里应用(到例如一周的开始?那么,如果我有date_trunc(week, 28/10/2020),我想在10月28日(10月26日(的一周开始?我在SQL命令行中尝试过,但收到了错误消息。

  2. 如果我正在执行:SELECT to_date ('02 Oct 2001', 'DD Mon YYYY');如何确保生成的格式是我指定的日期格式(而不是默认日期格式(?例如,如果我希望它的格式是DD-MM-YYYY?

  3. select to_char(date '2017-06-02', 'MM')<在这个例子中,为什么我们需要";日期";让它发挥作用?to_char的通用格式应为to_char(timestamp_expression,'format'(。我不认为在这种通用格式中,我们需要";天";。

  4. 如果我有一个像to_char(order_date, '20-10-2020')这样的WHERE过滤器,并且确实有一些行具有此订单日期,那么如果这些行是date格式(因此20 Oct是日期格式(,而不是字符串(这是我在执行to_char时筛选的依据(,这些行还会显示在我的结果中吗。我知道在这种情况下没有必要使用to_char,只是问一下。。

  1. 是的,可以使用文本形式的日期,但必须将其强制转换为正确的类型

这些查询将在中工作

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);

并返回时间戳2020-10-26 00:00:00.000000

注意,下一个查询

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

将失败并出现错误date/time field value out of range: "28/10/2020";

  1. 您可以使用to_char,它会返回text,如果您需要日期格式,则必须重新设置大小写
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'是一个文本,不能自动转换为时间戳。事实上,我不知道哪种文本格式可以。

  2. 不需要,您需要显式转换为date类型才能将其用作过滤器

where order_date = date_stored_as_a_text::date

我以不同的顺序回答问题,因为存在一些错误的假设:

问题3

'2017-06-02'date '2017-06-02'之间有一个普遍的区别-第一个只是varchar,一个字符串,Redshift没有将其作为日期处理,第二个是告诉Redshift将字符串作为日期处理并因此工作。

问题2

日期数据类型列没有格式-您可以使用sql客户端以不同格式显示日期列,但这不是redshift的功能。SELECT to_date ('02 Oct 2001', 'DD Mon YYYY');告诉红移将字符串'02 Oct 2001'转换为日期。

问题1

DATE_TRUNC('datepart', timestamp)还支持周作为日期部分-请参阅日期部分以获取日期或时间戳函数(也显示在AWS的示例中(。您还应该能够提供日期而不是时间戳。

问题4

to_char(order_date, '20-10-2020')不是过滤器,您使用错误。

AWS TO_CHAR

TO_CHAR将时间戳或数字表达式转换为字符串数据格式。

我想你正在寻找:

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

最新更新