泰勒布朗洛
5分钟阅读
当你打电话时,并不总是在那里。
这是我最有价值的SQL’黑客’的4部分系列的第2部分。查看系列中的其他:
第1部分:通用表格表达式
第2部分:关于这些日期
第3部分:另一个Join
第4部分:窗口函数
对不受欢迎的SQL黑客有一个建议,这对你带来了差异吗?让我知道!
但是,现在到主赛事:
SQL的日期和时间
无论你在写SQL多久,处理日期和时间都不是一个受欢迎的任务。他们令人惊讶的是棘手,当你最不期待的时候可以让你回来。
所以在这个版本的系列中,我将走过一些有用的日期/时间’黑客’,应该使新手和专家受益。
动作卡
在潜入代码之前,重要的是要拍摄我们所提供的高级工具。这就像玩棋盘游戏大流行(太快?),并且拥有你的角色的动作卡总是可见的,所以你想起了你每次转弯的动作。
以下是我们的SQL日期/时间操作卡,包括我们在日期/次执行的操作。在每个都是动作是一系列单独的函数和语法,但它有助于规划我们在这个高水平的分析。
例如,如果您有一些销售数据,并且您的BOSS希望看到季度总计,您将需要:
将字符串解析为日期(“20220110”)将本科日期截断到每个季度开始(2022-01-10)格式化这些日期在图表或表中看起来不错
> SQL Date/Time Action Card. Image by Author.
SQL的每个方言都有自己的函数,为每个动作,并且可悲的是它自己的语法。因此,而不是通过艰苦的细节进行每个行动,我将指导您到以下指南:
在bigquery的日期和时间Snowflake的日期和时间我的mvhs(最有价值的黑客)?
好的,现在有趣的部分 - 实际,有用的技巧是什么。这是我最亲爱的日期/时间’黑客的列表:
1.隐式转化
大多数数据库都有一个“隐式转化”的感觉,它只是在某些上下文中的意思,您可以键入日期字符串(“2022-01-01”),数据库将自动解决您要使用的日期 1月1日,2022。
这对于在日期列中过滤尤其有用。
示例:下面的查询将拉动2022年的所有伦敦天气数据。
为什么我喜欢它:如果我们没有这样的话,我必须始终将我的字符串响起为日期,或者在过滤时使用提取函数来获取我想要的日期部件。但是对于简单的日期范围,使用“yyyy-mm-dd”的字符串格式作为过滤器是我永远不会停止做的事情。
警告:与我的下一个点直接冲突,大多数数据库都要求这些日期以标准的ISO格式:“yyyy-mm-dd”,但有些让您自定义此操作。
2.全球化思考
作为欧洲的美国生活,每当我看到2022/10/06的日期时,我有一刻恐慌,如果我们在10月6日或6月10日谈论我们不确定。
而且,当我看到2022/10/06 10:00我更加困惑。当地时间为上午10点?世界标准时间?夏令时的时间?
即使您的数据和团队都位于同一时区,也思考存储和呈现的日期和时间是至关重要的。
要处理这个,我喜欢:
始终使用UTC时间戳,如果需要,为时区调整日期和时间创建新列当呈现日期时,我总是采取最后一步重新格式化日期至:月日,年份(10月6日,2022年)。(但我认为世界上大多数人可能会做出不同的方式)
示例:在对我的Netflix数据的分析中,每个程序的开始时间被给出为UTC时间戳。但要锻炼一天的时间,我需要观看最多的电视,我需要将此转换为当地时间。
为什么我喜欢它:让我高枕无忧,看看我的日期和时间代表着UTC,以及当地时间,所以我可以选择如何接近每个问题。
警告:在如何显示日期时,每个工具都具有不同的默认值。例如,在许多BI工具中,时间戳被自动调整到本地时间,因此您的定制转换可能是冗余的。如有疑问,更改计算机时区,并查看查询输出是否更改!
3.生成日期
如果在我们的数据集中发生的事情发生时,我想知道什么时候不知道他们没有?该用户什么时候不使用我们的应用程序?
这种工作需要一组统一日期,根本不会来自我们的数据。
在进行队列分析时,这特别有用。
示例:让我们说我想看看我每天看多少小时的电视(包括当我没有观看任何Netflix时)。我需要生成我想要查看的日期,然后将其连接到我的netflix数据。那天我没有观看任何电视,那个日期应该出现空值:
为什么我喜欢它:找出有时候没有发生的事情的频率就像它的那样重要。
警告:恼人地,每个SQL语法都有很不同的方式执行此操作。
有一些日期/时间SQL Hacks我错过了吗?让我在评论中知道?
进一步阅读PostgreSQL,BigQuery,Snowflake,Redshift,MySQL的日期/时间文档如果字幕看起来很熟悉,请在这里享受大约90岁的节拍。