js中的Date中月的值为0-11

本文介绍了一种根据客户端当前时间和日期动态展示广告的方法。通过将时间转换为统一格式并与广告投放期限进行对比,实现精确控制广告的展示时机。

1 .需求

    根据客户端现在的日期和时间,动态的显示广告主的广告.

   比如:

         广告主A 对应的广告A投放期限:2007-06-01 12:00:00 到2007-07-01 13:00:05

         广告主B 对应的广告B投放期限:2007-06-01 13:00:00 到2007-06-01 23:00:05

         客户端请求

                   请求时间<2007-06-01 12:00:00时,不显示广告

                  2007-06-01 13:00:00>请求时间>2007-06-01 12:00:00时,显示广告A.

                   2007-07-01 13:00:05>请求时间>2007-06-01 13:00:00时,显示广告A.广告B

                   202007-06-01 23:00:05>请求时间>2007-07-01 13:00:05时,显示广告B

                   请求时间>202007-06-01 23:00:05时,不显示广告

2.方法

         将客户端的日期转换成YYYY-MM-DD HH:MI:SS的字符串进行比较.代码如下,需要注意js中月的值为0-11

js 代码
  1. function currentDateToString() {   
  2.     try {   
  3.         var myDate = new Date();    
  4.         var year = myDate.getFullYear();   
  5.         var month = myDate.getMonth()+1;   
  6.         var date = myDate.getDate();   
  7.         var hours = myDate.getHours();    
  8.         var minutes = myDate.getMinutes();    
  9.         var seconds = myDate.getSeconds();   
  10.            
  11.         var myArray = Array();      
  12.         myArray[0] = year;   
  13.         myArray[1] = month>9?month.toString():'0' + month;      
  14.         myArray[2] = date>9?date.toString():'0' + date;       
  15.         myArray[3] = hours>9?hours.toString():'0' + hours;      
  16.         myArray[4] = minutes>9?minutes.toString():'0' + minutes;       
  17.         myArray[5] = seconds>9?seconds.toString():'0' + seconds;      
  18.        
  19.         return myArray[0]+"-"+myArray[1]+"-"+myArray[2]+" "+myArray[3]+":"+myArray[4]+":"+myArray[5];   
  20.     } catch ( e ) {   
  21.     }   
  22. }  
### 拉链表与SCD Type 2简介 拉链表是一种用于数据仓库设计的数据模型,能够记录数据从开始到当前状态的所有变化[^1]。它通过存储每一条数据的历史状态,解决了海量存储问题,并且是处理缓慢变化维(Slowly Changing Dimension, SCD)的一种常见方式,特别是SCD Type 2(记录所有历史变化)[^3]。 ### 拉链表的结构 拉链表通常包含以下字段: - **主键(Primary Key)**:唯一标识每条记录。 - **自然键(Natural Key)**:标识业务实体,如客户ID、产品ID等。 - **属性字段(Attributes)**:描述维度的属性信息。 - **生效时间(Start Date)**:记录该状态的生效时间。 - **失效时间(End Date)**:记录该状态的失效时间,若为NULL表示当前最新状态。 ### 拉链表中SCD Type 2的应用 SCD Type 2通过记录每个维度的历史变化,确保数据仓库能够反映历史状态。例如,一个客户地址变更时,拉链表会新增一条记录,并更新生效时间和失效时间,从而保留历史信息。 ### Oracle中拉链表的实现 在Oracle中,拉链表的实现通常涉及以下步骤: 1. **增量抽取当新增和修改数据**:通过ETL工具或SQL语句获取当新增和修改的数据。 2. **更新历史记录的失效时间**:将历史记录的失效时间设置为当天。 3. **插入新记录**:将当最新数据插入拉链表,并设置生效时间为当天,失效时间为NULL。 ### 每与每平均的计算方法 在拉链表中计算每或每的平均时,需要考虑数据的历史状态。以下是一个具体的SQL实现示例: #### 示例表结构 ```sql CREATE TABLE customer_dim ( customer_id NUMBER PRIMARY KEY, name VARCHAR2(100), address VARCHAR2(200), start_date DATE, end_date DATE ); ``` #### 每平均计算 假设需要计算每天的客户数量平均,可以使用以下SQL语句: ```sql SELECT TRUNC(start_date) AS day, COUNT(*) AS daily_count FROM customer_dim WHERE end_date IS NULL OR end_date >= TRUNC(SYSDATE) GROUP BY TRUNC(start_date); ``` #### 每平均计算 要计算每的客户数量平均,可以基于每数据进行聚合: ```sql SELECT TRUNC(day, 'MONTH') AS month, AVG(daily_count) AS monthly_avg FROM ( SELECT TRUNC(start_date) AS day, COUNT(*) AS daily_count FROM customer_dim WHERE end_date IS NULL OR end_date >= TRUNC(SYSDATE) GROUP BY TRUNC(start_date) ) daily_counts GROUP BY TRUNC(day, 'MONTH'); ``` ### 复杂场景的扩展 在某些情况下,可能需要计算某个特定属性(如客户地址)的变化频率或平均。可以通过以下方式实现: 1. **按属性分组**:在SQL中添加`GROUP BY`子句,按需要分析的属性进行分组。 2. **时间窗口分析**:使用`OVER()`函数结合时间窗口,计算移动平均。 #### 示例:按地址分组的每平均 ```sql SELECT TRUNC(start_date) AS day, address, COUNT(*) AS daily_count FROM customer_dim WHERE end_date IS NULL OR end_date >= TRUNC(SYSDATE) GROUP BY TRUNC(start_date), address; ``` ### 挑战与注意事项 1. **性能优化**:拉链表可能包含大量历史数据,查询时需注意索引优化,尤其是对`start_date`和`end_date`字段。 2. **数据一致性**:在更新拉链表时,需确保新增记录的`start_date`与历史记录的`end_date`一致。 3. **复杂性增加**:拉链表需要额外字段(如`start_date`和`end_date`),可能导致表结构复杂化。 ### 总结 在Oracle数据库中,拉链表结合SCD Type 2的设计,能够有效记录数据的历史变化,并支持复杂的分析需求。通过SQL语句,可以灵活计算每和每的平均,满足数据仓库中的统计分析需求。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值