我正在尝试在SQL语句中使用Date_Trunc for MONTH函数,但是不知怎么对我不起作用。我试图提取在2019年4月1日之后发生的条目。Redshift数据库中的原始日期格式是我试图将其归类为月/年存储桶的格式: 2019-04-08T00:13:20.000Z
输入
SELECT
client_id as user_id,
session_utc as job_date --(format:2019-04-08T00:13:20.000Z)
FROM table1 as hits
WHERE job_date >= DATE_TRUNC('month', 2019-04-01)
group by 1,2;
输出
"ERROR: function date_trunc("unknown", integer) does not exist Hint: No function matches the given name and argument types. You may need to add explicit type casts."
我在做什么错了?
答案 0 :(得分:1)
DATE_TRUNC Function - Amazon Redshift以 timestamp 作为输入,并提供 timestamp 作为输出:
DATE_TRUNC('datepart', timestamp)
例如:
SELECT DATE_TRUNC('month', '2019-05-07'::timestamp)
2019-05-01 00:00:00
因此,您的行应显示为:
WHERE job_date >= DATE_TRUNC('month', '2019-04-01'::timestamp)
如果您希望将输出作为日期,请附加::date
:
SELECT DATE_TRUNC('month', '2019-05-07'::timestamp)::date
2019-05-01
此外,请注意,日期会在午夜转换为时间戳。这可能会导致某些比较有所不同。例如:
'2019-05-07 03:03:31.389324+00'::timestamp > '2019-05-07'::timestamp
的评估结果为True
,因为它与一天开始时的午夜比较。这与比较两个日期(不带时间戳)不同。
答案 1 :(得分:0)
假设您使用的是Postgres,则需要在日期常量周围加上引号,并且可以将其转换为正确的类型:
WHERE job_date >= DATE_TRUNC('month'::text, '2019-04-01'::date)
Here是db <>小提琴。
答案 2 :(得分:0)
该函数的语法为DATE_TRUNC('datepart', timestamp)
,似乎您需要使用DATE_TRUNC('month', session_utc)
(,它已经截断到April 2019
的第一个日期,即 {{ 1}})