我正在使用PostgreSQL数据库,该数据库包含一个包含文本时间戳的字符列,格式为&#34;前缀:Wed May 7,11:30 AM-1:30 PM&#34;。没有年份,假设所有日期都在当前年份内。我意识到使用这些数据会更容易,如果它是在具有时间戳或日期和时间类型的列中,但我无法控制数据库格式,我必须使用那里的内容。< / p>
我需要做的是编写一个SELECT,它只返回具有特定前缀值的记录(例如&#34; public&#34; vs&#34; private&#34;)和时间/日期等于晚于当前时间/日期。这是一个相对较大的数据库,有大约100,000条记录,我需要能够快速进行搜索。任何人都可以就实现这一目标的最佳方式提供建议吗?我考虑使用正则表达式或to_date()和substring()的组合,但我不确定如何继续。
奖金问题:有没有办法按日期和时间顺序使用此字段订购记录?
答案 0 :(得分:3)
我觉得这样的事情会奏效:
select split_part(col, ':', 1) as prefix,
to_timestamp(to_char(now(), 'YYYY') ||
split_part(col, ':', 2),
'YYYY Dy Mon dd, HH:MIAM'
) as DateTime
答案 1 :(得分:0)
如果您需要能够将日期用作范围,则可以使用Postgres范围功能。 (或者您当然可以设置开始日期和结束日期。两者都在下面的示例中完成。)
WITH initial_strings AS (
SELECT 'Public: Wed May 7, 11:30AM-1:30PM'::varchar as char_time),
split_up AS
(
SELECT
split_part(char_time, ':', 1) prefix,
split_part(split_part(char_time,',',2), '-', 1)::TIME start_time,
split_part(split_part(char_time,',',2), '-', 2)::TIME end_time,
to_timestamp(to_char(now(), 'YYYY') ||
split_part(split_part(char_time,',',1), ':', 2),
'YYYY Dy Mon dd'
) as the_day
FROM initial_strings),
new_format AS
(
SELECT
prefix,
tstzrange((the_day + start_time),(the_day + end_time)) time_range,
the_day + start_time started_at,
the_day + end_time ended_at
FROM split_up
ORDER BY started_at) --Performs the required ordering
SELECT *
FROM new_format
WHERE prefix = 'Public'
AND started_at >= '2014-05-07';
这当然假设您的时间总是在同一天。如果情况并非如此,那么你的分裂就必须有点棘手,但它应该只是对此进行一些修改。